www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny24 Timer1 auslesen


Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich möchte über die Entladezeit eines Kondensators desssen Kapazität 
bestimmen. Habe dazu den einen Pol an den Komparatoreingang AIN1 
(PortA.2) und über einen Widerstand mit einem Portpin (PortA.3) 
verbunden und den anderen Pol an Masse gelegt. Das Assemblerprogramm 
lädt den Kondensator zunächst 1s lang. Direkt vor dem Entladen wird 
Timer1 gestartet und soll im Komparator-Interrupt ausgelesen und im 
EEPROM gespeichert werden.
Es scheint alles korrekt zu funktionieren (im Komparator-Interrupt wird 
eine LED angeschaltet), jedoch finden sich nach Ablauf des Programms im 
EEPROM unsinnige (viel zu kleine) Werte; das HIGH-Byte ist immer 0x00 
und das LOW-Byte schwankt ungefähr zwischen 0x06 und 0xA4.
Bei der Simulation im AVR-Studio funktionierte alles wie gewünscht, ich 
weiß echt nicht, wo der Fehler liegen könnte.
Hier der aktuelle Quelltext:
.include "tn24def.inc"

.macro ROT_AN
  sbi PORTB,0
.endmacro
.macro ROT_AUS
  cbi PORTB,0
.endmacro
.macro GRUEN_AN
  sbi PORTB,1
.endmacro
.macro GRUEN_AUS
  cbi PORTB,1
.endmacro
.macro C_LADEN
  sbi PORTA,3
.endmacro
.macro C_ENTLADEN
  cbi PORTA,3
.endmacro

.cseg
.org 0x0000
  rjmp main

.org EXT_INT0addr  ; External Interrupt Request 0
  reti
.org PCI0addr    ; Pin Change Interrupt Request 0
  reti
.org PCI1addr    ; Pin Change Interrupt Request 1
  reti
.org WATCHDOGaddr  ; Watchdog Time-out
  reti
.org ICP1addr    ; Timer/Counter1 Capture Event
  reti
.org OC1Aaddr    ; Timer/Counter1 Compare Match A
  reti
.org OC1Baddr    ; Timer/Counter1 Compare Match B
  reti
.org OVF1addr    ; Timer/Counter1 Overflow
  reti
.org OC0Aaddr    ; Timer/Counter0 Compare Match A
  reti
.org OC0Baddr    ; Timer/Counter0 Compare Match B
  reti
.org OVF0addr    ; Timer/Counter0 Overflow
  reti
.org ACIaddr    ; Analog Comparator
  rjmp AC_Int
.org ADCCaddr    ; ADC Conversion Complete
  reti
.org ERDYaddr    ; EEPROM Ready
  reti
.org USI_STRaddr  ; USI START
  reti
.org USI_OVFaddr  ; USI Overflow
  reti

.org INT_VECTORS_SIZE
main:
  ldi r16, RAMEND  ;Stackpointer initialisieren
  out SPL, r16
  ldi r16, 0x03  ;Ausgänge aktivieren
  out DDRB, r16
  sbi DDRA, 3
  ldi ZL, LOW(EEPROM_Daten)
  ldi ZH, HIGH(EEPROM_Daten)
  ROT_AN
  GRUEN_AN
  rcall wait1s
  ROT_AUS
  GRUEN_AUS
  rcall wait1s
  ROT_AN
  GRUEN_AN
  C_LADEN
  rcall wait1s
  ROT_AUS
  GRUEN_AUS
  cbi ADCSRB, ACME  ;AIN0 und AIN1 als Eingänge verwenden (Mux aus)
  cbi ACSR, ACIS1
  cbi ACSR, ACIS0
  sbi ACSR, ACIE  ;Komparator aktivieren
  ldi r16, 0x00
  out TCCR1B, r16
  out TCNT1H, r16
  out TCNT1L, r16
  ldi r16, (0<<CS12)|(0<<CS11)|(1<<CS10)
  out TCCR1B, r16  ;Timer starten
  sbi ACSR, ACI  ;AC-Interrupt zurücksetzen
  sei        ;Interrupts global aktivieren
  C_ENTLADEN
loop:
  rjmp loop

AC_Int:
  GRUEN_AN
;  ldi r18, 0x00
;  out TCCR1B, r18
  in r18, TCNT1H
  rcall EEPROM_Write
  adiw ZL, 1
  in r18, TCNT1L
  rcall EEPROM_Write
  cbi ACSR, ACIE
  reti

EEPROM_Write:
  sbic EECR, EEPE
  rjmp EEPROM_Write
  out EEARH, ZH
  out EEARL, ZL
  out EEDR, r18
  in r18, sreg
  cli
  sbi EECR, EEMPE
  sbi EECR, EEPE
  out sreg, r18
  ret

wait1s:
  push r16
  ldi r16, 0xFA
wait1s_inner:
  rcall wait1ms
  rcall wait1ms
  rcall wait1ms
  rcall wait1ms
  dec r16
  brne wait1s_inner
  pop r16
  ret

wait1ms:
  push r16
  push r17
  ldi r16, 0x10
wait1ms_r16:
  ldi r17, 0xA5
wait1ms_r17:
  dec r17
  brne wait1ms_r17
  dec r16
  brne wait1ms_r16
  pop r17
  pop r16
  ret

.eseg
EEPROM_Daten:

Ich hoffe ihr könnt mir helfen.
Danke und Gruß
Ladde

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>jedoch finden sich nach Ablauf des Programms im
>EEPROM unsinnige (viel zu kleine) Werte;

Wie groß sollte der im EEPROM abgespeicherte Wert denn sein?

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da mit bloßem Auge zu erkennen ist, dass die LED erst aus und nach 
kurzer Zeit wieder an geht (~0,1s) sollte der Timer1 schon mehrfach 
überlaufen bis er ausgelesen wird. Ich erwarte stark schwankende Werte 
(auch im HIGH-Byte), bekomme jedoch auch bei Variation des 
angeschlossenen Kondensators immer unwahrscheinlich kleine Werte 
(HIGH-Byte 0x00, LOW-Byte =< 0xB0).

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>  in r18, TCNT1H
>  rcall EEPROM_Write
>  adiw ZL, 1
>  in r18, TCNT1L

Falsche Reihenfolge. Erst TCNT1L, dann TCNT1H auslesen.

MfG Spess

Autor: Reinhard R. (reirawb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  in r18, TCNT1H
>  rcall EEPROM_Write
>  adiw ZL, 1
>  in r18, TCNT1L
>  rcall EEPROM_Write

Also, schau mal auf das Datenblatt, Seite 88, da steht etwas über die 
16-Bit-Zugriffe. Quintessenz des Textes:

16 Bit Schreiben: erst High-Byte, dann Low-Byte
16 Bit Lesen: erst Low-Byte, dann High-Byte

Wenn Du Dir das Blockdiagramm und die Beschreibung auf Seite 92 
durchliest, wird auch klar, warum. Beim Lesen des Low-Bytes wird das 
High-Byte in das Zwischenregister kopiert. Das High-Byte wird danach aus 
dem Zwischenregister gelesen. Liest Du zuerst das High-Byte, ist ja im 
Zwischenregister noch nichts.
Versuch es mal anders herum.

Viel Erfolg.

Reinhard

Autor: L. K. (ladde)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaaa! Das war's! Spess und Reinhard ihr seid meine Helden ;)
Hätte wohl mal das Datenblatt genauer lesen sollen...
Vielen Dank!

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.