www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD-Wandler am ATTiny44 bringt scheinbar nur einmal einen korrekten Wert


Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich steh hier voll auf dem Schlauch. Im Simulator läuft das Programm, am 
Device scheint der ATTiny44 nur einmal den Wert korrekt zu messen.

Ich möchte über einen Spannungsteiler die Spannung an einem Kondensator 
messen. Als Messeingang verwende ich dem PA1.
PA3 Wechselt auf High wenn meine Schwellspannung erreicht wird.
Das klappt aber nicht.
Resete ich den ATTiny44 wenn die Schwellspannung höher ist, dann wird 
PA3 High.
Resete ich den ATTiny44 wenn die Schwellspannung niedriger ist, dann ist 
der PA3 Low. Lade ich den Kondensator bleibt PA3 Low.
Der AD-Interrupt scheint aber zu funktionieren, da nur dort der 
Watchdogtimerreset erfolgt und ein WD-Reset scheinbar nicht ausgelöst 
wird.
Kennt jemand das Problem ?

;* Target  : ATTiny44
;**** includes ****
;Interner Takt 8MHz und Takteiler auf 8 somit effektiev 1MHz



.DEF V_Cpower_akt  =r2 ;Aktuelle Spannung am GoldCap in cV
.DEF V_MicPower_akt =r3  ;Aktuelle Spannung am µ-Controller
.DEF V_Cpower_alt  =r4 ;Alte Spannung am GoldCap in cV
.DEF V_MicPower_alt =r5  ;Alte Spannung am µ-Controller

.DEF Flags      =r23;Flags |C_V_Busy|Mic_V_Busy|0|0|0|0|0|0|

.EQU C_V_Busy    =7
.EQU Mic_V_Busy    =6

.include "tn44def.inc"

.ESEG
.ORG 0x00
datx:
  .DB 1, 2, 3, 4, 5, 6, 7, 8, 9

.CSEG
.ORG 0x00
  rjmp  RESET    ; Reset Handle
  reti        ; External Interrupt Request 0
  reti        ; Pin Change Interrupt Request 0
  reti        ; Pin Change Interrupt Request 1
  reti        ; Watchdog Timer Overflow
  reti        ; Timer/Counter1 Capture Event
  reti        ; Timer/Counter1 Compare Match A
  reti        ; Timer/Counter1 Compare Match B
  reti        ; Timer/Counter1 Overflow
  reti        ; Timer/Counter0 Compare Match A
  reti        ; Timer/Counter0 Compare Match B
  reti        ; Timer/Counter0 Overflow
  reti        ; Analog Comparator
  rjmp  ADC_Ready  ; ADC Conversion Complete
  reti        ; EEPROM Ready
  reti        ; USI Start Condition
  reti        ; USI Overflow

.ORG 0x11
RESET:
  ldi  r16,high(RAMEND)
  out  SPH,r16      ; Stack auf höchste RAM-Adresse
  ldi  r16,low(RAMEND)
  out  SPL,r16      ; Stack auf höchste RAM-Adresse
;Watchdog
  ldi r16,0b00001011
  out WDTCSR,r16
;Port ini
  ldi r16,0b00000000
  out PORTA,r16
  ldi r16,0b00111101
  out DDRA,r16
  ldi r16,0b00000000
  out PORTB,r16
  ldi r16,0b00000000
  out DDRB,r16
;AD-Wandler ini
  ;AD-Wandler ein, Inerrupt ein, Takt 125kHz
  ldi r16,1<<ADEN|0<<ADSC|0<<ADATE|0<<ADIF|1<<ADIE|3
  out ADCSRA,r16
  ldi r16,0<<BIN|0<<ACME|0<<ADLAR|0
  out ADCSRB,r16
  ;Nicht benötigte AD mit 1 ausschalten.
  ldi r16,0b11111101
  out DIDR0,r16
  ;Spannung am Kondensator messen Ref 1,1V 1 Digit =0,01 Volt
  ldi r16,1<<REFS1|1
  out ADMUX,r16
  sei

  sbi PORTA,PA2

  sbi ADCSRA,ADSC
Spannungen_C_messen:
  sbr Flags,1<<C_V_Busy
L1_C_V_Busy:
  sbrc Flags,C_V_Busy
  rjmp L1_C_V_Busy
  sbi ADCSRA,ADSC
  mov r16,V_Cpower_akt
  cpi r16,60
  brlo Spannungen_C_messen ;warten bis mind. 0,6V am C

  sbi PORTA,PA3

Spannungen_mC_messen:
  sbr Flags,1<<C_V_Busy|1<<Mic_V_Busy
L1_Mic_V_Busy:
  sbrc Flags,Mic_V_Busy
  rjmp L1_Mic_V_Busy
  sbi ADCSRA,ADSC
  mov r16,V_MicPower_akt
  cpi r16,0b10011010
  brlo Spannungen_mC_messen ;prüfen ob Mindestspannung am mC 
überschritten wurde

  sbi PORTA,PA4

mC_low_check:
  sbr Flags,1<<C_V_Busy|1<<Mic_V_Busy
L2_Mic_V_Busy:
  sbrc Flags,Mic_V_Busy
  rjmp L2_Mic_V_Busy
  sbi ADCSRA,ADSC
  mov r16,V_MicPower_akt
  cpi r16,0b10011000
  brsh mC_low_check  ;prüfen ob Mindestspannung unterschritten wurde.

  sbi PORTA,PA5

  mov r16,V_Cpower_akt
  cpi r16,60
  brlo Spannungen_C_messen ;prüfen ob mind. 0,6V am C

  sbi PORTA,PA0

  mov r17,V_Cpower_akt
  subi r17,30

I_C_Tr_Check:
  sbr Flags,1<<C_V_Busy
L3_C_V_Busy:
  sbrc Flags,C_V_Busy
  rjmp L3_C_V_Busy
  sbi ADCSRA,ADSC
  cp V_Cpower_akt,r17
  brsh I_C_Tr_Check ;warten bis am C, U um 0,3V gesunken.

  cbi PORTA,PA0

mC_fall_check:
  sbr Flags,1<<C_V_Busy|1<<Mic_V_Busy
L3_Mic_V_Busy:
  sbrc Flags,Mic_V_Busy
  rjmp L3_Mic_V_Busy
  sbi ADCSRA,ADSC
  cp V_MicPower_akt,V_MicPower_alt
  brsh mC_fall_check ;warte bis am mC U fällt.
  rjmp mC_low_check


ADC_Ready:
  wdr
  sbrs Flags,C_V_Busy  ;wenn C_V_Busy gesetzt dann ist das Ergebnis die 
Spannung am C
  rjmp ADC_Ready_MicC
  cbr Flags,1<<C_V_Busy
  mov V_Cpower_alt,V_Cpower_akt
  in r15,ADCH
  in V_Cpower_akt,ADCL
  ldi r22,0<<REFS1|1  ;Vorbereitung zu Mic_V Messung
  out ADMUX,r22
  sbrc Flags,Mic_V_Busy
  sbi ADCSRA,ADSC
  lsr r15
  ror V_Cpower_akt
  lsr r15
  ror V_Cpower_akt
  ldi r22,1<<REFS1|1  ;Vorbereitung zu Mic_V Messung rückgängig ?
  sbrs Flags,Mic_V_Busy
  out ADMUX,r22
  reti

ADC_Ready_MicC:
  sbrs Flags,Mic_V_Busy
  rjmp ADC_Ready_Exit
  sbi ADMUX,REFS1
  mov V_MicPower_alt,V_MicPower_akt
  clr V_MicPower_akt
  in r22,ADCH
  cpi r22,0
  brne ADC_Ready_Exit
  in r15,ADCL
  mov r22,V_Cpower_akt
  sub r22,r15
  brlo ADC_Ready_Exit ;Spannung < 4,4 Volt
  inc V_MicPower_akt
  lsl r22        ;Rest r22 maximal 51
  lsl r22

  ldi r21,2
  neg r15
DIVLOOP:
  add r22,r15
  rol r21
  sbrs r21,0
  sub r22,r15
  lsl r22
  sbrs r21,7
  rjmp DIVLOOP

  mov V_MicPower_akt,r21

ADC_Ready_Exit:
  cbr Flags,1<<C_V_Busy|1<<Mic_V_Busy
  reti

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Auslesen des ADC-Datenregisters muss unbedingt zuerst ADCL 
gelesen werden und dann ADCH! Der ADC kann nach einem Lesezugriff auf 
ADCL erst dann wieder einen neuen Wert in die beiden Register schreiben, 
wenn ADCH gelesen wurde. Wenn ADCL nach ADCH gelesen wird, dann werden 
die Register blockiert.

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Wenn ADCL nach ADCH gelesen wird, dann werden
>>die Register blockiert.

Ganz genau richtig!
Und das ist auch keine Schikane, sondern hat seinen guten Grund.
Nur so ist sichergestellt, dass Du BEIDE Register ungestört auslesen 
kannst und nicht (z.b. bei free-running-mode) ein neuer Wert dazwischen 
funkt.

Jochen Müller

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tausend Dank,
klar lesen von 16 Bit-Werten beim AVR. Ich Trottel, voll in die Falle 
getabt.

Ich Danke euch herzlich !!!!!!!!!!!!!!!!!!!!!!!!!!!

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werd verückt !
Eure Erklärung past genau auf das Fehler Bild, aber das Problem ist 
immer noch das Gleiche. Ich habe die Interruptroutine nun so geändert:
ADC_Ready:
  wdr
  sbrs Flags,C_V_Busy  ;wenn C_V_Busy gesetzt dann ist das Ergebnis die Spannung am C
  rjmp ADC_Ready_MicC
  cbr Flags,1<<C_V_Busy
  mov V_Cpower_alt,V_Cpower_akt
in V_Cpower_akt,ADCL
in r15,ADCH
  ldi r22,0<<REFS1|1  ;Vorbereitung zu Mic_V Messung
  out ADMUX,r22
  sbrc Flags,Mic_V_Busy
  sbi ADCSRA,ADSC
  lsr r15
  ror V_Cpower_akt
  lsr r15
  ror V_Cpower_akt
  ldi r22,1<<REFS1|1  ;Vorbereitung zu Mic_V Messung rückgängig ?
  sbrs Flags,Mic_V_Busy
  out ADMUX,r22
  reti

ADC_Ready_MicC:
  sbrs Flags,Mic_V_Busy
  rjmp ADC_Ready_Exit
  sbi ADMUX,REFS1
  mov V_MicPower_alt,V_MicPower_akt
  clr V_MicPower_akt
in r15,ADCL
in r22,ADCH
  cpi r22,0
  brne ADC_Ready_Exit
  mov r22,V_Cpower_akt
  sub r22,r15
  brlo ADC_Ready_Exit ;Spannung < 4,4 Volt
  inc V_MicPower_akt
  lsl r22        ;Rest r22 maximal 51
  lsl r22

  ldi r21,2
  neg r15  
DIVLOOP:
  add r22,r15
  rol r21
  sbrs r21,0
  sub r22,r15
  lsl r22
  sbrs r21,7
  rjmp DIVLOOP

  mov V_MicPower_akt,r21

ADC_Ready_Exit:
  cbr Flags,1<<C_V_Busy|1<<Mic_V_Busy
  reti

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.