• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Atmel Attiny13V: Interrupts mit Bascom?

TeamElvis

Geocacher
hallo,

ich versuche gerade mit einem attiny 13 die interrupts zu verwenden. nach dem ich verschiedene tutorials gelesen habe, dachte ich, ich haette was verstanden.
leider macht der atmel nicht das was ich mir vorgestellt habe.


basis ist erstmal das reaktivlicht ohne ldr. irgendwo hab ich ein programm dauerblinken.bas aufgetrieben, das die led einfach nur blinken laesst. das klappt soweit.
ich habe eine schleife mit powerdown und watchdog erstellt, so dass die led in kurzem takt blinkt. so weiss ich, dass er in der schleife ist.

jetzt soll int0 int0 mittels on int0 gosub ... die led 5 sekunden lang einschalten. prinzipiell hat das im debugger auch geklappt. nur statt der led hatte ich dort ein lcd 'angeschlossen'.

in der realitaet blinkt jetzt die led 2-3 mal kurz, und danach einmal 5 sekunden an. das war nicht das was ich mir vorgestellt hab.
also hab ich ueberlegt, analog zum led einen hochohmigen (4,7mohm) widerstand an den int0 gegen masse gelegt, so dass erstmal gar kein interrupt auftreten sollte.
ist die ueberlegung richtig? und wenn ja, wieso hat das nichts geholfen? vielleicht kann mich ja jemand in die richtige richtung schubsen.

fernziel soll sein, elektrische module (z.b. sprachmodul) irgendwie per interrupt einzuschalten.
 
OP
T

TeamElvis

Geocacher
zunaechst mal mit einem stueck draht. ich hatte dabei an eine verbindung von + zum int0 port gedacht.
spaeter soll da z.b. ein bewegungsmelder dran. wie ich das dann mache weiss ich aber auch noch nicht.

morgen kommt mein lcd display und ein atmega 48. mal sehen, ob das mit dem etwas leichter wird. die led als ausgabe medium ist schon etwas mager :)
 
OP
T

TeamElvis

Geocacher
ich weiss nicht, wie ich das in so einen weissen kasten bekomme,
daher erstmal einfach so.

ich hab den code um eine menge aktuell inaktive teile bereinigt.
einige reste hab ich noch drin gelassen

'-----------------------------------------------------------------------------------------

'name : timer0.bas

'copyright : (c) 1995-2005, MCS Electronics

'purpose : shows how to use TIMER0 related statements

'micro : 90S2313

'suited for demo : yes

'commercial addon needed : no

'-----------------------------------------------------------------------------------------



$regfile = "ATtiny13.DAT"
$crystal = 128000 'Frequenz des internen 128kHz-Oszillators
Config Portb = &B00011000 'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111 'Pullups zuschalten, auser fur Pinb.3 und .4

'portd.2=

$hwstack = 32 ' default use 32 for the hardware stack

$swstack = 10 ' default use 10 for the SW stack

$framesize = 40 ' default use 40 for the frame space






Config Timer0 = Counter , Edge = Rising

Tcnt0 = 0





Config Timer0 = Timer , Prescale = 256


'Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
'Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen


'Define the ISR handler

On Ovf0 Tim0_isr

'Enable Timer0 ' enable the timer interrupt

Config Int0 = Rising

Enable Interrupts 'allow interrupts to occur



On Int0 Label_int0


'Gosub Label_int0



Enable Int0
wdtcr = &B11010011
Do
Portb.3 = 1
Waitms 50
Portb.3 = 0
'Reset Watchdog
'Powerdown
Waitms 500
nop
'Portb.3 = 1
'Waitms 50
'Portb.3 = 0
'Reset Watchdog
'Powerdown
' Wait 3
Loop






Label_int0:
Disable Int0
Portb.3 = 1
Wait 3
Portb.3 = 0
Enable Int0
Return




End
 

carhu

Geocacher
TeamElvis schrieb:
ich weiss nicht, wie ich das in so einen weissen kasten bekomme
Markieren und auf Code klicken:
Code:
$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen 128kHz-Oszillators
Config Portb = &B00011000                                   'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, auser fur Pinb.3 und .4

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Config Timer0 = Counter , Edge = Rising
Tcnt0 = 0
Config Timer0 = Timer , Prescale = 256

'Define the ISR handler
On Ovf0 Tim0_isr

Config Int0 = Rising

Enable Interrupts                                           'allow interrupts to occur
On Int0 Label_int0

Enable Int0
wdtcr = &B11010011
Do
   Portb.3 = 1
   Waitms 50
   Portb.3 = 0
   Waitms 500
   nop
Loop

Label_int0:
   Disable Int0
   Portb.3 = 1
   Wait 3
   Portb.3 = 0
   Enable Int0
Return

End
 

Swunn

Geocacher
Schalten nach + geht nicht, wenn Du die Pull-Ups aktiviert hast, musst Du den Pin nach GND schalten.

3sec Warten in Interrupt ist böse! :twisted: Wenn in dieser Zeit ein weiterer Interrupt (Störung) auftritt, wird die ISR sofort nach dem Verlassen wieder angesprungen u.s.w.

Um das zu verhindern, muss vor dem Verlassen der ISR noch das Flag INTF0 im Register GIFR gelöscht werden, indem man eine 1 reinschreibt. Du solltest mal prüfen, ob "Enable Int0" das macht.

Swunn

Btw: Das "On Ovf0 Tim0_isr" meckert Bascom nicht an, obwohl es dieses Label nicht gibt?
 
OP
T

TeamElvis

Geocacher
mit diesem code

Code:
$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen 128kHz-Oszillators
Config Portb = &B00011000                                   'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, auser fur Pinb.3 und .4


$hwstack = 32                                               ' default use 32 for the hardware stack

$swstack = 10                                               ' default use 10 for the SW stack

$framesize = 40                                             ' default use 40 for the frame space


Dim I As Byte



Config Int0 = Low Level
Enable Interrupts                                           'allow interrupts to occur

On Int0 Label_int0
I = 0
Enable Int0

Do
   If I > 0 Then
      Disable Int0
      Portb.3 = 1
      Wait 5
      Portb.3 = 0
      I = 0
      Enable Int0
   Else
      Portb.3 = 1
      Waitms 50
      Portb.3 = 0
      'Reset Watchdog
      'Powerdown
   End If
   Waitms 750
Loop

Label_int0:
   Disable Int0
   I = I + 1
   Enable Int0
Return


End

blinkt die led sehr schnell. wenn ich pin pb0 mit masse verbinde, wird aber kein interrupt ausgeloest. im avr simulator klappt das ganze.
 
OP
T

TeamElvis

Geocacher
jetzt klappt es. es ist immer das gleiche, wer lesen kann ist klar im vorteil.

ich hab den int0 an pb0 ausloesen wollen. das kann nicht gehen. das ist pcint0. das ist nicht das gleiche wie int0. der liegt auf pb1 und ist dort auch als pcint1 bekannt.
 
OP
T

TeamElvis

Geocacher
so, hier mal das programm fuer die, die vielleicht interessiert.

Code:
'============================================================
'
' ********************************************************
' ***                                                  ***
' ***                ReaktivSchalter                   ***
' ***         mit Watchdog-Energiesparmodus            ***
' ***                                                  ***
' *** erstellt von TeamElvis für www.geoclub.de        ***
' ***                14.12.2007006                     ***
' ***                                                  ***
' ********************************************************
'
' µC: ATtiny13V
' +Ub: 3,00 V
'============================================================



$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen 128kHz-Oszillators
Config Portb = &B00011000                                   'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, auser fur Pinb.3 und .4


Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen
Stop Adc                                                    ' ADC auch aus.

$hwstack = 32                                               ' default use 32 for the hardware stack

$swstack = 10                                               ' default use 10 for the SW stack

$framesize = 40                                             ' default use 40 for the frame space

Config Int0 = Low Level

Const Longblinkmax = 100

Dim Longblinkcount As Byte
Dim I As Byte
Dim Voice As Byte
I = 0
Longblinkcount = 0

Portb.3 = 0
Portb.4 = 0

Enable Interrupts                                           'allow interrupts to occur

On Int0 Label_int0

Enable Int0
Voice = 0
Do
   If I > 0 Then                                            ' ein interrupt will bearbeitet werden
      If I > 1 Then
         I = 1
      End If
      Disable Int0
      Longblinkcount = Longblinkcount + 1                   ' wir brauchen eine ganze weile strom
      Portb.3 = 1                                           ' also einschalten und etwas schlafen gehen
      Wdtcr = &B11010011
      Reset Watchdog
      Powerdown
      If Longblinkcount >= 8 And Voice > 0 Then             ' PlayTaste mit etwas Verzoegerung druecken
         Portb.4 = 1
         Waitms 100
         Portb.4 = 0
         Voice = 0                                          ' Die Playtaste soll genau ein mal gedrueckt werden
      End If
      If Longblinkcount >= Longblinkmax Then
         Longblinkcount = 0                                 ' das war jetzt genug strom,
         Portb.4 = 0                                        ' playtasten schalter auch aus
         Portb.3 = 0                                        ' schaltimpuls fuer sprachmodul kann wieder aus!
         I = 0

'         Portb.3 = 1  ' hiermit habe ich anfangs eine led kurz blinken lassen, damit ich wusste, dass abgeschaltet wurde.
'         Waitms 250
'         Portb.3 = 0
'         Waitms 250
'         Portb.3 = 1
'         Waitms 250
'         Portb.3 = 0
'         Waitms 250
'         Portb.3 = 1
'         Waitms 250
'         Portb.3 = 0
'         Waitms 250
'         Portb.3 = 1
'         Waitms 250
'         Portb.3 = 0
'         Waitms 250
'         Portb.3 = 1
'         Waitms 250
'         Portb.3 = 0


         Enable Int0                                        ' es darf wieder gedrueckt werden.
      End If
   End If
   If I = 0 Then                                            ' keine Interrupt Bearbeitung, also lange schlafen
      Gosub Grossepause
   End If
Loop

Label_int0:
I = I + 1                                                   ' aha, es drueckt jemand auf den schalter
Voice = 1
Return


Grossepause:
Wdtcr = &B11110001                                          'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcr = &B11100010                                          'Watchdog wieder ca 1 sek stellen?
   'Portb.3 = 1 ' hier hab ich anfangs auch erstmal die led kurz blinken lassen um zu sehen, ob es laeuft
   'Waitms 250
   'Portb.3 = 0
   'Waitms 250
   'Portb.3 = 1
   'Waitms 250
   'Portb.3 = 0
Return

End

pb1 gegen masse loest den interrupt aus. der schaltet pb3 ein
wo man ein relais anschliessen kann, mit dem z.b. ein sprachmodul
aktiviert wird. vielleicht laeuft das auch direkt. hab ich noch nicht ausprobiert.
pb4 hab ich mit der playtaste des sprachmoduls verbunden. diese wird
ein paar sekunden spaeter einmal gedrueckt. etwas spaeter deshalb,
damit das ding auch auf jeden fall startklar ist.

der interrupt klappt auch aus dem powerdown modus mit watchdog.
im prinzip laeuft er den ganzen tag durch die schleife. alle 8 sekunden einmal kurz aufwachen. geht halt leider mit dem watchdog nicht anders.

die schaltung muesste also aehnlich sparsam sein, wie das reaktivlicht.
sprachmodul und aehnliches braucht auch nicht viel, weil es nur bei
bedarf eingeschaltet wird.

kann mir jemand sagen, ob ich statt des powerdown auch ein NOP verwenden kann? theoretisch muesste der tiny dann ja auch nichts machen. braucht der dafuer viel strom? ein interrupt kann ja in der zeit auch ausgeloest werden.

ich werd jetzt mal schauen, mit welchen sensoren ich einen interrupt ausloesen kann :)
 

Windi

Geoguru
Eine NOP-Schleife braucht mehr Strom als der Powerdown.
Obwohl der Befehl zwar NOP (No Operation) heisst ist ja nicht so dass der Prozessor dabei nichts macht.
Der Befehl muss aus dem Speicher gelesen und ausgewertet werden, der Programmzähler muss erhöht werden, der nächste Befehl muss eingelesen werden ........
All das verursacht einen Stromverbrauch. Dieser ist ca. 10 mal so hoch wie mit dem Powerdown-Befehl
 
Oben