PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tiny13 und Analogkomparator



moin
15.05.2011, 16:51
Hallo,
ich habe Probleme den AnalogKomparator richtig einzusetzen. Mein Programm reagiert nicht auf einen Pegelwechsel.

Ein Pegelwechsel an PB2 (ADC1) soll vom Komparator erkannt werden. Bei jedem Pegelwechsel soll ein Relais wackeln (als Test). Verwendet werden soll die interne Referenz von 1,1V. Mein Pegel muss dann also deutlich größer oder kleiner 1,1V sein.
Wenn dass Programm die Mainloop erreicht hat, reagiert es nicht mehr :-(

Vielleicht könnt ihr den Fehler in meinem Programm entdecken.

Danke Jörn


'Pin1-PB5= Reset mit 100nF gegen Masse und 10k nach 5V
'Pin2-PB3= Relais
'Pin3-PB4= Relais
'Pin4= GND
'Pin5-PB0= (MOSI)
'Pin6-PB1= (MISO)
'Pin7-PB2= SCK und Analogeingang für den AnalogKomparator ADC1
'Pin8= VCC 5V
'
$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 8
$swstack = 2
$framesize = 5

Stop Timer0
Stop Watchdog
Stop Adc

Dim Test01 As Byte
Test01 = 0
Ddrb = &B00011000

Ddrb = &B00011000
Portb.4 = 1 'Relais als Test wackeln
Portb.3 = 0
Waitms 500
Portb.4 = 0
Portb.3 = 1
Waitms 500
Portb.4 = 1
Portb.3 = 0
Waitms 500

Ddrb = &B00000000



Config Aci = On , Compare = Off , Trigger = Toggle


Adcsrb.acme = 1 'Analoge Comparator Multiplexer Enable
Acsr.acbg = 1 'Referenzspannung eingeschaltet
'Adcsra.aden = 0
Admux = 1 'Analogeingang für den AC ist ADC1 d.h. PB2
Start Ac
On Aci On_aci

Enable Interrupts

Do



Loop


On_aci:
Test01 = Adcsr.aco

If Test01 = 0 Then
Ddrb = &B00011000
Portb.4 = 1
Portb.3 = 0 'Relais als Test wackeln
Waitms 500
Portb.4 = 0
Portb.3 = 1
Waitms 500
Portb.4 = 1
Portb.3 = 0
Waitms 500

Ddrb = &B00000000
Else
Ddrb = &B00011000
Portb.4 = 0
Portb.3 = 1 'Relais als Test wackeln
Waitms 500
Portb.4 = 1
Portb.3 = 0
Waitms 500
Portb.4 = 0
Portb.3 = 1
Waitms 500


Ddrb = &B00000000
End If

Return

da_reefer
15.05.2011, 17:36
Hallo,

mit dem Tiny13 habe ich noch nicht gearbeitet, aber ich schätze mal dass dein HW stack überläuft, nachdem er nur 8 Bytes groß ist und du in der ISR alle Register sicherst (= 32 Bytes HW Stack)...

Probiers mal mit:

...

On Aci On_aci Nosave
Dim Aci_isr_flag As Bit

...

Do

...

If Aci_isr_flag = 1 Then
Aci_isr_flag = 0

... ' ISR code

End If
Loop

...

On_aci:
!push R25
!push R24
!IN R24, SREG
!PUSH R24
Aci_isr_flag = 1 ' set flag
!pop R24
!Out Sreg , R24
!POP R24
!pop R25
Return

mfg

Searcher
15.05.2011, 18:01
Hallo moin,

ich kann auch nicht entdecken, wo Du den Interrupt für den Comparator ermöglichst. zB mit "Enable ACI"
Enable Interrupts ermöglicht nur generell Interrupts.

Gruß
Searcher

moin
15.05.2011, 22:55
Ich möchte mich bei euch für die Hilfe bedanken. Der Fehler wurde gefunden. :)

Hier ist nun der funktionierende Code. Der Tiny13 wird nun mit 128kHz getaktet um Strom zu sparen und um wenig Funktörungen hervorzurufen (meine Sorge). Mehr Einsparpotential bei der Energie kann ich nicht mehr finden. Der Verbrauch liegt bei <1mA.

Der Tip mit dem fehlenden "Enable Aci" hat den Durchbruch gebracht. Zur Sicherheit habe ich auch noch den Stack vergrößert.

Grüße Jörn



'Pin1-PB5= Reset mit 100nF gegen Masse und 10k nach 5V
'Pin2-PB3= Relais
'Pin3-PB4= Relais
'Pin4= GND
'Pin5-PB0= (MOSI)
'Pin6-PB1= (MISO)
'Pin7-PB2= SCK und Analogeingang für XFIL (AnalogKomparator)
'Pin8= VCC 5V
'
$regfile = "ATtiny13.dat"
'$crystal = 9600000
$crystal = 128000
$hwstack = 32
$swstack = 8
$framesize = 16

Stop Timer0
Stop Watchdog
Stop Adc

Dim Test As Byte

Config Aci = On , Compare = Off , Trigger = Toggle


Adcsrb.acme = 1 'Analoge Comparator Multiplexer Enable
Acsr.acbg = 1 'Referenzspannung eingeschaltet
Admux = 1
Start Ac
On Aci On_aci
Stop Adc

If Acsr.aco = 1 And Test = 1 Then
Test = 0
Ddrb = &B00011000
Portb.4 = 0
Portb.3 = 1 'Relais als Test wackeln
Waitms 100
Ddrb = &B00000000
End If

If Acsr.aco = 0 And Test = 0 Then
Test = 1
Ddrb = &B00011000
Portb.4 = 1
Portb.3 = 0 'Relais als Test wackeln
Waitms 100
Ddrb = &B00000000
End If

Enable Aci
Enable Interrupts

Do
Power Idle
'Idle
Loop


On_aci:

If Acsr.aco = 1 And Test = 1 Then
Test = 0
Ddrb = &B00011000
Portb.4 = 0
Portb.3 = 1 'Relais als Test wackeln
Waitms 100
Ddrb = &B00000000
End If

If Acsr.aco = 0 And Test = 0 Then
Test = 1
Ddrb = &B00011000
Portb.4 = 1
Portb.3 = 0 'Relais als Test wackeln
Waitms 100
Ddrb = &B00000000
End If
Return