Hallo und willkomen im Forum,
Poste doch mal die Codeschnipsel.
Wenn Du auf [Erweitert] klickst, bekommst Du die Codetags um
zu posten.Code:So was
Dann kann Dir vermutlich erher jemand helfen.
Hallo und willkomen im Forum,
Poste doch mal die Codeschnipsel.
Wenn Du auf [Erweitert] klickst, bekommst Du die Codetags um
zu posten.Code:So was
Dann kann Dir vermutlich erher jemand helfen.
Hallo i_make_it,
wenn gewollt dann kann ich auch noch die Quellen angeben, wo ich diese codes gefunden habe.
Blinken, ist bereits mit den sek. der Uhr abgestimmt, der code ist con hier
das anschalten der LED hatte ich bereis auf einen taster reduziert. der code kommt von hierCode:#define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { DDRD = (1 << PD5); // Endlosschleife for (;;) { PORTD |= (1 << PD5); // bit im Portregister auf 1 setzen => LED leuchtet _delay_ms(1034); // eine halbe Sekunde warten PORTD &= ~(1 << PD5); // bit im Portregister auf 0 setzen => LED aus _delay_ms(1034); // eine halbe Sekunde warten } }
ich hoffe das hilft weiterCode:#include <avr/io.h> int main(void) { DDRD = 0b01100000; PORTD = 0x00; short led1 = 0; while(1) { if(PIND & ((1 << PD2))) { // irgendein Taster gedrückt if(PIND & (1 << PD2)) { // Taster 1 gedrückt → LED1 in Warteschlange setzen led1 = 1; } } else { // kein Taster gedrückt → Warteschlange abarbeiten if(led1 == 1) { // LED1 in Warteschlange led1 = 0; // LED1 aus Warteschlange herausnehmen PORTD ^= (1 << PD5); // XOR an PD5 anwenden: 1 wenn bisher 0, 0 wenn bisher 1 // } } } } return 0; }
Geändert von Jens1 (01.03.2017 um 18:10 Uhr)
Ein Problem sind die "_delay_ms".
In der Zeit macht der µC nichts (außer warten).
Der Code ist so nicht gedacht das man mehr als das Blinken machen kann.
Eine Möglichkeit wäre:
Da ich mich mit dem Attiny2313 und dem C dafür nicht auskenne, kann keinen konkreten Code angeben.Code:Startmarke {sofern main(void) nicht bereits eine Endlosschleife ist} Prüfen ob aktuelle Zeit minus Zeitstempel größer oder gleich der Verzögerungszeit ist Wenn ja, LED togeln und Zeitstempel neu setzen. Abfrage ob Taster betätigt Reaktion auf Tastendruck Sprung zur Startmarke {sofern main(void) nicht bereits eine Endlosschleife ist}
Nach kurzem suchen nach "Attiny2313 C ide" bekomme ich als erste Treffer Arduino IDE und Amtel Studio zurück.
Mit was arbeitest Du denn?
Die Suche nach "Attiny2313 _delay_ms();" hat mich zu:
https://startingelectronics.org/tuto...2313-tutorial/
geführt.
Danach passt die Syntax zu Amtel Studio.
Hier:
http://www.ulrichradig.de/home/uploa...rogramming.pdf
ab Seite 35 gibts was zu den Timern.
Hier:
https://startingelectronics.org/tuto...-polled-timer/
findeset Du etwa in der Mitte der der Seite einen Code der mit dem Timer einen PIN togglet.
Bei jedem Durchlauf der While Schleife wird geprüft ob die Bedingung für einen Toggle erfüllt ist und wenn nicht wird die Schleife weiter abgearbeitet (z.B. Tasterauswertung).
Das ist eine Variante die es ermöglicht mehr als eine Sache auszuführen, da so eine Schleife einige tausend mal durchlaufen wird bevor einmal die Bedingung (1034 Millisekunden vergangen) erfüllt wird.
Geändert von i_make_it (02.03.2017 um 08:44 Uhr)
Hallo i_make_it,
vielen Dank erstmal. Ich werde mich morgen abend mal ransetzen und mal schauen was ich davon verstehe.
das mit dem delay hatte ich auch schon vermutet und da kam mir die einfache idee, ich nehm 2 attiny2313.
Der eine macht die Tastergeschichte, der andere wird durch den ersten mit Spannung versorgt und gibt dann wiederum den Blinkimpuls ab.
Da die Blinkenden Trenner eh über einen Transistor laufen, ist auch nicht zu viel am 2313 dran.
ist zwar nicht schn, aber vielleicht einfacher umzusetzen.
Ich nutze im übrigen Amtel Studio 7.
Gruß Jens
So Sachen wie delay/wait/sleep kontra Timer/Interrupt sind an sich nicht Sprachabhängig, sondern bei fast allen µC üblich.
Delay ist fast immer ein KO für die Ausführung mehrerer Aktionen, da es die Programausführung einfach anhält. Sprich es wird nichts anderes verarbeitet (außer Hardwaretimer und Interrupts).
Für so was zwei Attiniy zu nehmen, ist tatsächlich nicht schön. Ob es einfacher umzusetzen ist weis ich nicht, da ja immer noch der eine per Delay auf nichts reagiert. also auch nicht auch ein Signal von außen.
Der führt dann 2068 Millisekunden pluß ein paar CPU Zykluszeiten das Blinken aus und reagiert da genau einmal auf einen eventuell grade dann anstehenden Pegel an einem Eingang.
Entweder man baut das ganze mit diskreter Schaltlogik auf oder muß sich einmal mit µCs an sich und dem C-Dialekt vom Amtel Studio im besonderen auseinander setzen.
Letzteres würde ich jetzt empfehlen.
Der Code von:
https://startingelectronics.org/tuto...-polled-timer/
scheint mir ganz gut zu sein.
Das Tutorial drumrum hilft dann vermutlich auch noch mal etwas weiter.
Eventuell klinkt sich hier ja auch noch jemand ein der mit der Kombination "Attiny2313, Amtel Studio 7 und C" vertraut ist.Code:#include <avr/io.h> int main(void) { char toggle = 0; DDRD |= (1 << PD6); // LED on PD6 TCCR0A = 0x02; // Clear Timer on Compare Match (CTC) mode OCR0A = 0xFF; // number to count up to TCCR0B = 0x05; // clock source CLK/1024, start timer while(1) { if (TIFR & 0x01) { // timer timed out? TIFR |= 0x01; // reset timer flag // toggle LED each time the timer times out if (toggle) { toggle = 0; PORTD &= ~(1 << PD6); } else { toggle = 1; PORTD |= (1 << PD6); } } } }
Bei dem Code oben wäre der Port für die LED anzupassen und der prescaler für den Timer, damit der Blinkintervall zu Deinen Anforderungen passt.
Dann könnte man die Tasterabfrage hinter dem while (direkt vor dem If) einbauen.
Bei dieser Logik, kann man Blinken wählen, Blinken und LED's sowie alles aus.
LED's ohne Blinken ist nicht auswählbar.
Ist das so gewollt?
Oder hast Du diese Option übersehen?
Geändert von i_make_it (02.03.2017 um 09:14 Uhr)
Hallo i_make_it,
die Logik ist so gewollt. Die Hauptsache sind die Blinkenden Trenner, Nebensache die LED Beleuchtung. Vielen Dank für den Hinweis.
Mit dem zweiten Attiny2313 dachte ich mir das so:
Dann könnte der Delaycode in den 2. 2313, und der erste versorgt den zweiten nur mit der Betriebsspannung wenn gewünscht.
Dann wäre nur das Problem mit der mit den 3-4 Tastendrücken zu lösen.
Ich werd mich jetzt erstmal mit deinen Links befassen und versuchen da was draus zu lernen.
Danke schön
Geändert von Jens1 (02.03.2017 um 19:19 Uhr)
Ich hab versucht etwas zu verstehen, aber momentan hab ich information overload und versteh grad nix mehr. Ich schlaf jetzt erstmal drüber.
Lesezeichen