'a1Minutentakt mit Sleep für ATtiny2313,Stellen mit INT0 'Hardware: LED's an PORTB.0 bis PORTB.4 'läuft, 23.09.2011 lässt sich mit !Sleep nicht wieder laden. '---------------------------------------------------------- $regfile = "ATTiny2313.dat" 'ATTiny2313-Deklarationen $crystal = 1000000 'Interner 1MHz Taktgenerator $baud = 4800 'zum Auslesen der Printbefehle '---------------------------------------------------------- Declare Sub Schalten Declare Sub Plus Declare Sub Minus Declare Sub Auswahl 'Auswahl der Polarität Declare Sub Stellen '---------------------------------------------------------- Dim A As Bit 'Für die Auswahl Dim B As Byte 'Zeitschleife Dim C As Byte 'Startwert von Timer1 '---------------------------------------------------------- 'Mit dem Timer1Überlauf soll aus dem Sleepmodus aufgeweckt werden On Timer1 Ontimer1 'Timer1-Overflow-Interrupt-Routine On Int0 Stellen 'Zum Überbrücken der Zeitschleife '---------------------------------------------------------- Ddrb = &B00011111 'Pins PB7-5_Eingang;Pins PB4-0_Ausgang Portb = &B11100000 'PullUps an PB7-PB5 aktivieren Ddrd = &B00000000 'PortD.3 ist Ausgang Portd = &B11111111 ' C = 100 '---------------------------------------------------------- Config Timer1 = Timer , Prescale = 256 'Takt ist Quarz/256 Enable Timer1 'Timer1-Overflow-Interrupt ein Config Int0 = Low Level Enable Int0 Enable Interrupts 'Interrupts global einschalten '---------------------------------------------------------- 'Da mit Timer1 längere Schlafzeiten,aber nur externe Interupts mögich sind wird PORTB.0 als Eingang benutzt 'und mit Timer1 gesetzt.Das hat so schon funktioniert. Mcucr = &B01100000 'Bit6_Standbymodus;Bit5_Sleepenable;Bits1-0 '=00_Lowlevel für INT0 Gimsk = &B01100000 'Bit6_ext.INT0 enable;Bit5_Pinchange enable ' Pcmsk = &B00000001 'Bit0_PCINT0 (PB0) ausgewählt als Aufwecksignal Timer1 = C 'TCNT1H+TCNT1L;Überlauf nach ca 4,5sec? '---------------------------------------------------------- Do 'Hauptschleife For B = 1 To 4 Print " schlafen" '!Sleep 'In den Sleep-Modus gehen um Strom zu sparen Portb.1 = 1 'zeigt, dass die Schleife funktioniert Wait 1 Portb.1 = 0 Wait 1 Print " aufgewacht"; Print " " ; B Next Gosub Schalten Loop '---------------------------------------------------------- Schalten: 'Polaritätsauswahl vorbereitet A = Not A Gosub Auswahl Return '---------------------------------------------------------- Auswahl: 'Polaritätsauswahl Print " A= " ; A 'zeigt,dass Auswahl funktioniert If A = 0 Then Gosub Plus End If If A = 1 Then Gosub Minus End If Return '---------------------------------------------------------- Plus: Print " Plus" Portb.2 = 0 'minus an a von Spule Print " Minus an a " Portb.3 = 1 'plus an b von Spule Waitms 100 Print " Plus an b " Waitms 100 Portb.4 = 1 'Spannung an Spule Print " Spannung an " Waitms 1000 Portb.4 = 0 Portb.3 = 0 Return '---------------------------------------------------------- Minus: Print " Minus" Portb.2 = 1 Print " Minus an b " Portb.3 = 0 Waitms 100 Print " Plus an a " Waitms 100 Portb.4 = 1 Print " Spannung an " Waitms 1000 Portb.4 = 0 Portb.2 = 0 Return '---------------------------------------------------------- Stellen: 'Damit wird die Zeitschleife überbrückt Print " Stellen" Portb.1 = 1 'zeigt, dass Stellen funktioniert Wait 1 Portb.1 = 0 B = 4 Return '---------------------------------------------------------- Ontimer1: 'Overflow-Interrupt Print " Ueberlauf" 'zeigt, dass Ontimer1 funktioniert Portb.0 = 1 'PCINT0 ein, um zu wecken Wait 1 Portb.0 = 0 Return End '------------------