Forum: Mikrocontroller und Digitale Elektronik ATtiny13 ADC FRAGE ASM (VERSTEHEN)


von Gerd A. (inputsammler)


Lesenswert?

Hey

Ich versuche mich gerade mal an den ADC um ihn zu verstehen.
Habe hier einen Attiny13 und eine 4x3 Matrix die ich über ADDC einlese.
Und über einen SW Uart ausgebe.

Im Moment ist adc auf Interupt eingestellt und es kommen auch die 
passenden Werte am terminal an.

Meine 1.Frage ist funktioniert das überhaupt.
Interupt kommt
--> lese WERT nach R1
--> dann lese ich den Wert nochmal ein um zu sehen ob er sich verändert 
hat. Eina Art sicherstellen das auch der richtige Wert kommt.
Aber kann er sich zu dieser zeit überhaut ändern ??

2. Frage
Im Moment ist er im FreeRunning Mode.
Dachte wenn ich nicht immer aktiv sein soll sondern nur wenn sich was am 
ADC Eingang (WERT) ändert muß ich ihn mit Interrup steuern.
Aber er ist immer im Interupt (LED blinkt)
Was muß ich machen damit er nur beim ändern des ADC Wertes in den 
Interupt geht.

Danke vor erst mal

Gruß Gerd
1
intadc:              
2
      ;[STACK usw...] Hier macht die Int-Service-Routine irgendwas, benutzt Register R16
3
getADC:    in rKey,ADCH ; Lese AD-Wandler MSB
4
      mov R1,rKey ; kopiere AD-Wandler-Wert nach R1
5
      
6
      in R16,ADCH  ; LADE ADC WERT für CP nach R16
7
      ldi  temp,40  ; Für Entprellen lade ich 40 mnal sehen ob adc gleich ist
8
9
10
Entprell1:    ; von temp ein abzeihen decrement
11
      IN R24,ADCH  ; Lade ADCh nochmal in Register rmp (R20)  
12
      CP R24,R16  ; Vergleiche die 2 Ergebinisse 
13
      BRNE  getADC  ;If Z set
14
      dec  temp 
15
      brne  Entprell1
16
      sbi PORTB,REL1    ; Ausgang = aus ein
17
      rcall GetKeyCode
18
19
HIER SIND dann noch ein paar pausen unw erkennung des Wert aus der Tabelle übergabe an UART
20
21
     cbi PORTB,REL1    ; Ausgang = aus low
22
     RETI

von Walter (Gast)


Lesenswert?

so wird as nix:
wenn du schnell genug 40 mal den ADC ausliest wird er immer den gleichen 
Wert haben
und du solltest in der Interruptroutine nicht so viel Zeit verplempern,
kein Wunder wenn gleich der nächste Interrupt kommt

von Frank S. (Firma: HSCS) (linuxerr)


Lesenswert?

wozu liest du den adc mehrmals aus? der adc kann einen interrupt 
generieren, wenn er mit der messung fertig ist und in die 
interruptroutine nimmst du die auswertung der adc-werte hinein, fertig. 
ein polling ist unnötig.

von Gerd A. (inputsammler)


Angehängte Dateien:

Lesenswert?

Danke erst mal,

Der Interupt kommt sobald er fertig ist mit dem einlesen.
Also kann ich es nicht in der Routine testen ob der ADC wert der gleiche 
ist (können schon aber macht keinen Sinn) Verstanden

Das Problem das ich habe das DIE ADC Interrupt schnell hintereinander 
kommen.

Will den ADC Wert einer Zahl in der Tabelle ZUWEISEN. (Zahl von 1-12)
das geht auch so weit so gut.

Dich ich will sichergehen das der Wert auch 10x hintereinander der selbe 
ist.

Habe es mal geändert --> schalte global Interupt ab werte die sachen aus 
dann wieder aktiv.

BITTE nicht steinigen aber ich will hald asembler lernen damit ich den 
AVR auch verstehe..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.