Forum: Mikrocontroller und Digitale Elektronik Kalibrieren via button


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Armin A. (10110010)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe mittlerweile festgestellt, dass ich meine tiny13a kalibrieren 
muss.

Jetzt hatte ich vor ein periodisches Signal bei dem immer 1ms signal 
anliegt dafü zu benutzen.
Jetzt lasse ich einen counter laufen. Diesen werte ich aus, wenn das 
Signal gefallen ist und gebe einen zu hohen bzw. zu niedrigen Counter 
voa LEDS aus.

Nun wollte ich 2 Buttons einbauen mit denen ich den OSCCAL 
incrementieren oder decrementieren kann.

wenn ich das richtig verstanden habe, müssen diese beiden Pins für ein 
null signal an masse und für ein 1 signal an VCC.
Wenn ich jetzt den kontakt von der masse löse, resgiert der Tiny schon!

Wie genau muss ein Button geschaltet werden?

: Bearbeitet durch User
von Horst (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Armin A. schrieb:
> Wie genau muss ein Button geschaltet werden?

So, daß er funktioniert.
Und das hängt vom Rest der Schaltung (PullUp, PullDown ...) und Deine 
Programmierung ab.

Üblich ist es, im Tiny einen PullUp-Widerstand zu programmieren und den 
Taster zwischen Masse und den Pin zu schalten.

von Armin A. (10110010)


Bewertung
-1 lesenswert
nicht lesenswert
Was ist ein pullup wiederstand?

von Horst (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Armin A. schrieb:
> Was ist ein pullup wiederstand?

Das weiss ich auch nicht.

Aber ein PullUp Widerstand ist ein Widerstand zwischen dem Eingangspin 
und der Versorgungsspannung der bei offenem Eingang für einen 
definierten High-Pegel sorgt.
Der ist bei den meisten aktuellen Mikroprozessoren schon eingebaut und 
muß nur programmiert werden.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
Servus Armin,

Armin A. schrieb:
> Nun wollte ich 2 Buttons einbauen mit denen ich den OSCCAL
> incrementieren oder decrementieren kann.

Warum lässt Du das den Tiny nicht automatisch machen?
Ich würde die automatische Kalibrierung z.B. so vorschlagen:

Signal mit genauer Frequenz (z.B. 1kHz) am Eingang anlegen, wobei die 
Frequenz eine ist, die im späteren Betrieb garantiert nicht auftritt.
Wenn die Firmware nach dem Reset die "Kalibrier"-Frequenz erkennt (mit 
+/- 10% Toleranz), geht sie in den Kalibriermodus und misst die 
angelegte Periodendauer. Je nach Ergebnis wird OSCCAL entsprechend 
verändert, und die absolute Abweichung der Messung gespeichert. Wenn bei 
der nächsten Messung die absolute Abweichung größer ist, als die der 
letzten Messung, war der OSCCAL-Wert der letzten Messung der optimale 
Kalibrierungswert und wird ins EEPROM geschrieben - fertig.

von Jakob (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Tiny13a mit Tasten kalibrieren...

Vielleicht zeigst du mal den Schaltungsentwurf und nennst uns
die Funktion des Tiny13? Ohne natürlich dein HOCHGEHEIMES
Projekt zu verraten. ;-)

Sonst wird es eher Rätselraten, statt Hilfe.
Immerhin hat der Tiny13 nur 5...6 verfügbare Pins, von denen
wohl einige gebraucht werden.

Ich denke auch, dass du mit dem 1 ms - Signal und EINEM
Kal-Taster die automatische Kalibrierung (ein von dir zu
schreibendes Progrämmchen im Tiny13) auslösen kannst und das
Resultat ins EEPROM schreiben lässt, was du beim nächsten
Neustart auslesen lässt. (Steht alles im Datenblatt...)

Den Taster erkennt man am Einfachsten, wenn der Taster bei
Betätigung nach Masse schaltet = LOW, während ein PullUp-
Widerstand (siehe Datenblatt Tiny13) sonst einen HIGH-Pegel
am Anschluss des Tasters erzeugt.

Also: SCHÖN WAS ZUM LERNEN!
Steig ein!

von Armin A. (10110010)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe jetzt mal die MEthode mit dem PullUp versucht.
1. Mit folgendem Code wird der OSCCAL nicht verändert, obwohl ich das 
setze.
2. Ich dachte ich muss IN R21, OSCCAL schreiben um das OSCCAL Register 
in mein Register zu schreiben. Dann bekomme ich aber 0xFF. Wenn ich LDI 
R21, OSCCAL verwende bekomme ich 0x31. Ist das so richtig?

Hier der Code:
;-----------------------------------
;- Interrupts                      -
;-----------------------------------
    rjmp  RESET             ; Reset Handler
    RETI                   ; IRQ0 Handler
    RETI                    ; PCINT0 Handler
    RETI                    ; Timer0 Overflow Handler
    RETI                    ; EEPROM Ready Handler
    RETI                    ; Analog Comparator Handler
    RETI                    ; Timer0 CompareA Handler
    RETI                    ; Timer0 CompareB Handler
    RETI                    ; Watchdog Interrupt Handler
    RETI                    ; ADC Conversion Handler

;-----------------------------------
;- Reset Interrupts                -
;-----------------------------------
RESET:
    SBIC EECR,EEPE       ; Prüfe Zugriff auf EEPROM
  RJMP RESET           ; Versuh nochmal, wenn nicht bereit
  LDI R24, 0x00        ; Definiere Adresse
  OUT EEARL,R24        ; Setze Adresse
  SBI EECR,EERE        ; Definiere Leden
  IN  R16,EEDR         ; Lese Adresse in Register
  CPI R16, 0xFF
  BREQ JumpOSCCAL
  OUT OSCCAL, R16      ; Setze Calibrierung
  rjmp JumpSave
JumpOSCCAL:
  SBIC EECR,EEPE       ; Ist EEPROM bereit
  RJMP JumpOSCCAL      ; Wenn nein, dann wiederholen
  LDI R24, 0x00        ; Definiere Adresse 0
    OUT EEARL, R24       ; Setzte Adresse
  LDI R16, OSCCAL      ; Lese ASCCAL
  OUT EEDR, R16        ; Übergebe Wert
  SBI EECR,EEMPE       ; Aktiviere Schreiben
  SBI EECR,EEPE        ; Schreibe
JumpSave:
    LDI r16, low (RAMEND)
    OUT SPL, r16     ; Setzt den StackPointer auf Anfang
    LDI r16, 0b00001000
    OUT DDRB, r16     ; Setzt PB3->Output
  LDI R16, 0b00000011
    OUT PORTB, R16     ; PullUp
    LDI XH, 0x00
  LDI XL, 0x00
  LDI YL, 0xB0
  LDI YH, 0x04


;-----------------------------------
;- Main-Loop                       -
;-----------------------------------
Aus:
  CBI PORTB, 0x03     ; Löschen des Ausgangs
  in R19, PINB    ; Lese Pins in R19
  andi R19, 0b00000001; Isoliere PB0
  CPI R19, 0x00    ; Vergleiche ob Signal anliegt
  BREQ CheckDown    ; Wenn kein UpSignal dan check Down
  CPI R20, 0x01       ; Prüfen, ob Signal bereits behandelt
  BREQ CheckDown      ; Wenn behandelt, dann check Down
  LDI R20, 0x01      ; Wenn noch nicht behandelt, dann behandeln
  LDI R21, OSCCAL      ; Lese OSCCAL
  INC R21             ; Incrementiere R21
  OUT OSCCAL, R21      ; Schreibe neuen Wert in OSCCAL
CheckDown:
    IN R19, PINB        ; Lese Pins in R19
  ANDI R19, 0b00000010; Isoliere PB1
  CPI R19, 0x00       ; Vergleiche ob Signal anliegt
  BREQ CheckNone      ; Wenn kein DownSignal dan check None
  CPI R20, 0x01       ; Prüfe ob Signal bereits behandelt
  BREQ CheckNone      ; Wenn behandelt, danncheck None
  LDI R20, 0x01      ; Wenn noch nicht behandelt, dann behandeln
  LDI R21, OSCCAL      ; Lese OSCCAL
  DEC R21             ; Decrementiere R21
  OUT OSCCAL, R21     ; Schreibe neuen Wert in OSCCAL
CheckNone:
    IN R19, PINB        ; Lese Pins in R19
  ANDI R19, 0b00000011; Isoliere PB0 & PB1
  CPI R19, 0x00       ; Vergleiche ob Signal anliegt
  BRNE JumpWrite      ; Wenn Signal anliegt, Überspringe Schreiben
  CPI R20, 0x01       ; Vergleiche, ob vorher ein Signal anlag
  BREQ TryWrite       ; Wenn Signal anlag, Schreibe
  rjmp JumpWrite      ; Wenn Signal nicht anlag, überspringe Schreiben
TryWrite:
  SBIC EECR,EEPE      ; Ist EEPROM bereit
  RJMP TryWrite       ; Wenn nein, dann wiederholen
  LDI R24, 0x00       ; Definiere Adresse 0
    OUT EEARL, R24      ; Setzte Adresse
  LDI R21, OSCCAL
  OUT EEDR, R21       ; Übergebe Wert
  SBI EECR,EEMPE      ; Aktiviere Schreiben
  SBI EECR,EEPE       ; Schreibe
  LDI R20, 0x00       ; Resette den Fläg ob schon behandelt wurde
JumpWrite:
  ADIW XL, 1          ; Addiere
  CP XL, YL           ; Vergleiche Wert
  CPC XH, YH          ;
  BREQ An             ; Wenn JA, dann an!
  rjmp Aus            ; Wenn NEIN, dann weiter!
An:
    SBI PORTB, 0x03     ; (2) Schalte Ausgang
  NOP                 ; (1)
  SBIW XL, 1          ; (2) Subtrahiere
  CP XL, ZL           ; (1) Vergleiche Wert
  CPC XH, ZL          ; (1)
  BREQ Aus            ; (1/2) Wenn JA, dann aus!
    rjmp An             ; (2) Wenn NEIN, dass weiter!

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]
  • [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.