ATtiny 2313 problemen na spanningloos maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Looney11
  • Registratie: December 2004
  • Laatst online: 14-10 12:44
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
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!

Acties:
  • 0 Henk 'm!

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 12-10 06:44

Sprite_tm

Semi-Chinees

Wat bedoel je met 'het derde register van de timer'?

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


Acties:
  • 0 Henk 'm!

  • virus.elektro
  • Registratie: Januari 2002
  • Laatst online: 18:33

virus.elektro

profesionele monitor sloper

Vul je alle registers met een bekende waarde?
de drie counter registers (cntTimeLo,cntTimeMid,cntTimeHi) zou ik resetten voordat je gaat tellen.
verder zie ik dat je cntTimeHi vult met 0xFF als je een carry hebt. daar zou de 255 dus vandaan kunnen komen.

elektrotechniek is leuk (nog wel). ik ga dus weer verder met leuke dingen ontwerpen. amd 2200+ 256mb 333mhz,gf4 440mx, 120gb,16X dvd. jarr-url


Acties:
  • 0 Henk 'm!

  • Looney11
  • Registratie: December 2004
  • Laatst online: 14-10 12:44
Sprite_tm schreef op woensdag 31 maart 2010 @ 19:13:
Wat bedoel je met 'het derde register van de timer'?
Ik ben niet heel helder geweest in mijn OP, de schakeling loopt op 20MHz en we hebben een specifieke tijd nodig. omdat elke kloktik 0,05^10-9 seconden duurt, maken we gebruik van 3 registers die in elkaar overlopen als ze 256 hebben bereikt. Vandaar ook de namen low, med en hi. De Hi register (MSB) blijft steken op 255 bij het spanningloos maken en weer opstarten van de schakeling.
virus.elektro schreef op woensdag 31 maart 2010 @ 19:57:
Vul je alle registers met een bekende waarde?
de drie counter registers (cntTimeLo,cntTimeMid,cntTimeHi) zou ik resetten voordat je gaat tellen.
verder zie ik dat je cntTimeHi vult met 0xFF als je een carry hebt. daar zou de 255 dus vandaan kunnen komen.
De registers worden gecleared in de init fase van het programma.

Acties:
  • 0 Henk 'm!

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 12-10 06:44

Sprite_tm

Semi-Chinees

Weet je zeker dat je registers niet overlappen en/of de registers Zero en One wel echt die waardes krijgen?

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


Acties:
  • 0 Henk 'm!

  • insan1ty
  • Registratie: Oktober 2001
  • Laatst online: 15-03-2023
Gebruik je een 16-bits timer? Indien ja: je moet de high en low byte altijd schrijven in een bepaalde volgorde, volgens mij eerst high, dan low. Als je het andersom doet, of 1 van de twee niet wegschrijft, gebeurt er niets met de counter... Daar heb ik wel eens een avondje naar gezocht.

Acties:
  • 0 Henk 'm!

  • Looney11
  • Registratie: December 2004
  • Laatst online: 14-10 12:44
De Atiny 2313 is een 8 bits controller, 16 bits wordt pittig. Wat we zien in de simulator is dat de registers keurig in elkaar "overlopen".

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 01:05
Het is wel een 8- bits controller, maar hij heeft wel degelijk een 16-bits timer. Als je die gebruikt, kun je met 1 byte een 24-bits timer maken, op dezelfde manier zoals je dat nu doet met de 8-bits timer.

Mijn gok is trouwens dat je iets vergeet te initialiseren. Heb je ook de datasheets gelezen over wat je allemaal moet doen om de timers goed in te stellen en om de seriële poort goed te initialiseren?

[ Voor 33% gewijzigd door Jaap-Jan op 05-04-2010 23:05 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Looney11
  • Registratie: December 2004
  • Laatst online: 14-10 12:44
Hallo,

We zijn er achter gekomen wat de fout was. Er werd met Increment een waarde in een register opgeteld. Bij de initiele programmering van de 2313 werd dit correct uitgevoerd. Echter, door het spanningsloos maken van de 2313 en daarna weer opstarten van het geheel bleek het register waar deze waarde werd gelezen een niet gedefineerde waarde aan te nemen. Bij iedere INCR instructie werd dus een waarde X (i.p.v 1) opgeteld :/

Door nu deze waarde in de initialisatie fase mee te nemen en het register te nullen is het probleem opgelost.

Bedankt voor de pointers!

Topic mag wat mij betreft dicht.
Pagina: 1