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?
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.
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.
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.
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!
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.