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
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.