Hallo allemaal,
Voor het werk ben ik bezig om een schakeling gemaakt die een bepaalde tijd een comperator monitored en dan een pulse uitzendt.
Deze pulse wordt vooraf gedefinieerd en dan middels RS232 de ATtiny ingeschoten. Daarna wordt de monitorcyclus gestart en tegelijkertijd een timer. Nadat de timer afgelopen is, worden de waardes van de monitor en timer teruggelezen naar de PC.
Dit alles gebeurd via timer interrupt routines (timer overflow).
Nu doet het volgende zich voor;
Bij het programmeren van de unit en de daarop volgende cycli werkt alles prima, de waarden die we verwachten worden inderdaad teruggelezen vanuit de ATtiny.
Als we echter de schakeling spanningloos maken en later weer opnieuw opstarten, gaat het fout. Na het opnieuw programmeren van de pulse in het RAM geheugen van de ATtiny en het daarna monitoren van de waarden blijkt het derde register van de timer (er zijn er in totaal 3 voor de timer) altijd als resultaat 255 terug geven. Dit terwijl die in het eerste geval keurig de correcte waarde bleef teruggeven.
Als we de ATtiny wederom geheel programmeren, dan de pulse er weer in duwen gaat het wel weer goed maar is niet echt de bedoeling.
Mijn vraag;
- Is het de ATtiny die de geest geeft? (er zijn 4 nieuwe onderweg)
- Bijten de Interupts elkaar als we de waarden inlezen en de timer loopt?
- Zijn er wellicht andere zaken die we over het hoofd hebben gezien?
Timer interupr routine
Overzicht Interupts
Elke hulp is welkom!
Voor het werk ben ik bezig om een schakeling gemaakt die een bepaalde tijd een comperator monitored en dan een pulse uitzendt.
Deze pulse wordt vooraf gedefinieerd en dan middels RS232 de ATtiny ingeschoten. Daarna wordt de monitorcyclus gestart en tegelijkertijd een timer. Nadat de timer afgelopen is, worden de waardes van de monitor en timer teruggelezen naar de PC.
Dit alles gebeurd via timer interrupt routines (timer overflow).
Nu doet het volgende zich voor;
Bij het programmeren van de unit en de daarop volgende cycli werkt alles prima, de waarden die we verwachten worden inderdaad teruggelezen vanuit de ATtiny.
Als we echter de schakeling spanningloos maken en later weer opnieuw opstarten, gaat het fout. Na het opnieuw programmeren van de pulse in het RAM geheugen van de ATtiny en het daarna monitoren van de waarden blijkt het derde register van de timer (er zijn er in totaal 3 voor de timer) altijd als resultaat 255 terug geven. Dit terwijl die in het eerste geval keurig de correcte waarde bleef teruggeven.
Als we de ATtiny wederom geheel programmeren, dan de pulse er weer in duwen gaat het wel weer goed maar is niet echt de bedoeling.
Mijn vraag;
- Is het de ATtiny die de geest geeft? (er zijn 4 nieuwe onderweg)
- Bijten de Interupts elkaar als we de waarden inlezen en de timer loopt?
- Zijn er wellicht andere zaken die we over het hoofd hebben gezien?
Timer interupr routine
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| TIMER0_OVF: CBI PORTD, PD4 ;Set trigger out low ;Total measurement time intClock: ;Increment Clock ADD cntTimeLo,One ;Increment clock lsb ADC cntTimeMid,Zero ;Add carry of cntTimerLo ADC cntTimeHi,Zero ;Add carry of cntTimerMid BRCC intClockEnd LDI varX,0xff ;Set to max value if overflow of cntTimerHi MOV cntTimeHi,varX intClockEnd: intCloseMoveTime: SBIS ACSR,ACO ;Skip if comparator on RJMP intCloseMoveTimeEnd ;Goto End if comparator off (no TX signal) ;Total transmit time of EUT intCloseTime: CBI PORTB, PB2 ;Comparator LED on ADD cntCloseLo,One ;Increment lsb of closing time ADC cntCloseMid,Zero ;Add carry ADC cntCloseHi,Zero ;Add carry BRCC intCloseTimeEnd LDI varX,0xff ;Set to max value if overflow of cntCloseTimeHi MOV cntCloseHi,varX intCloseTimeEnd: ;Last transmit time of EUT intMoveTime: MOV MoveLo,cntTimeLo ;Latch Time: get the last transmit time of EUT MOV MoveMid,cntTimeMid MOV MoveHi,cntTimeHi intMoveTimeEnd: intCloseMoveTimeEnd: ;END OF TX DETECTOR ROUTINE SBI PORTB, PB2 ;Comparator LED off RETI |
Overzicht Interupts
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ;--- INTERRUPT VECTORS (0x0000 - 0x0012) RJMP RESET ;Reset Handler RJMP NOT_USED ;External Interrupt0 Handler RJMP NOT_USED ;External Interrupt1 Handler RJMP NOT_USED ;Timer1 Capture Handler RJMP NOT_USED ;Timer1 CompareA Handler RJMP NOT_USED ;Timer1 Overflow Handler RJMP TIMER0_OVF ;Timer0 Overflow Handler RJMP USART0_RXC ;USART0 RX Complete Handler RJMP NOT_USED ;USART0,UDR Empty Handler RJMP NOT_USED ;USART0 TX Complete Handler RJMP NOT_USED ;Analog Comparator Handler RJMP NOT_USED ;Pin Change Interrupt RJMP NOT_USED ;Timer1 Compare B Handler RJMP NOT_USED ;Timer0 Compare A Handler RJMP NOT_USED ;Timer0 Compare B Handler RJMP NOT_USED ;USI Start Handler RJMP NOT_USED ;USI Overflow Handler RJMP NOT_USED ;EEPROM Ready Handler RJMP NOT_USED ;Watchdog Overflow Handler |
Elke hulp is welkom!