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 alle miteinander
Mein Name ist Jens,
und ich benötige hilfe bei einem Nixieuhrenprojekt.
Die Uhr war ein Bausatz und ist soweit montiert und funktionstüchtig.
Nun zum Problem:
Ich habe unter die Röhren, Blaue LED´s montiert und wollte diese mit einem Schalter ein und wieder ausschalten. Leider findet sich kein Schalter, der genauso aussieht wie die 2 Taster, die ich bereits an der Uhr habe. Also dachte ich mir, ein Taster und ein Attiny2313 (der noch von einem anderen Projekt übrig ist) tut es auch.
Das wäre jetzt aber noch einfach zu lösen, aber ich habe noch Std / Min und Min / Sek Trenner dazwischen, die im 0,5hz Takt blinken sollen. Dieser Takt soll ebenfalls vom 2313 kommen und auch über den selben Taster ein und ausschaltbar sein.
Nun bin ich ehrlich, ich habe keine Ahnung von C. Seit ca 9 Tagen versuche ich mich mit Codeschnippseln und scheitere kläglich.
Das Blinken (ohne andere Funktionen) klappt
Das Einschalten der LED´s klappt.
Alles zusammen, klappt nicht. Weil ich keine Ahnung habe, wie es zusammengesetzt wird.
Die Option jetzt C von der Pieke auf zu lernen, ist keine Wirkliche. Familie und Arbeit spannen mich schon genug ein und ne Programmiersprache lernt sich nunmal nicht von heute auf morgen.
Könnte sich jemand vorstellen mir zu helfen?
zu den Vorstellungen:
PD2 als Eingang für den Taster, der gegen Masse schaltet und somit keine Hardwareentprellung braucht
PD3 als Ausgang für die LED Beleuchtung
PD4 als Ausgang für die Blinkenden Trenner
optional:
PD5 gegen Masse (hab in der Uhr einen NE555, der am Pin5 die Hochspannung steuert, schaltet man den gegen Masse, dann ist die Hochspannung ausgeschalten. der PD5 dürfte aber auch keine Spannung abgeben, also nur Spannungslos oder Masse dürfen anliegen)
zu den Tastendrücken hatte ich mir gedacht:
1x drücken, Blinken ein
ein weiters mal drücken LED´s einschalten
ein weiters mal drücken, alles aus und optional PD5 gegen Masse
dann wieder von vorn
Falls sich jemand findet, dann schon einmal vielen Dank.
Wie gesagt, es ist keine Forderung, sondern nur eine freundliche Nachfrage.
Geändert von Jens1 (01.03.2017 um 17:57 Uhr)
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 19: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 09: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 10: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 20: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.
Häppchenweise, nicht alles auf einmal.
Die Blinkfunktion ist das wichtigste, da es die einzige Funktion ist die eine ständige Überwachung und Akrion (PIN Toggle) des µC's erfordert.
Die Funktion muß als erstes sauber implementiert werden.
Der Rest regiert ja nur bei Tastendruck.
Da wäre dann die IRQ Auswertung eines Eingangs sinnvoll.
In der ISR wird dann nur eine Zählervariable immer um 1 hochgezählt.
In der normalen Programmschleife wird dann bei Zählerstand = 1 eine Variable fürs Blinken gesetzt.
Bei Zählerstand = 2 eine Variable für die Beleuchtung
Und bei Zählerstand = 3 wird der Zählerstand auf 0 gesetzt und beide Variablen gelöscht.
Danach wird einmal geprüft ob die Variable für die Beleuchtung = 1 oder = 0 ist und dementsprechend der PIN für die Beleuchtung von 0 auf 1 oder von 1 auf 0 umgeschaltet.
Beim Blinken wird das "toggle = 1;" in eine weitere Abfrage gepackt und dort geprüft, ob die Variable fürs Blinken = 1 ist.
Somit lauft die Mimik fürs Blinken nach Zeit, ständig durch.
Aber ob Die LED's wirklich leuchten hängt vom Zustand der Blinkvariable ab.
Das ist so wie wenn Du das Rechtecksignal mit einem astabilen Multivibrator erzeugst und dann einen Transistor als Schalter hast, der das nur weiterleitet wenn an er durchgeschaltet ist.
Bei einem Hardwaraufbau würde man auch genau das machen.
Den Schalter/Taster als Takt für einen binären Zähler bis 3 nehmen (0-2). und dann per logischer Verknüpfung der Ausgangbits für den Zustand 1 und den Zustand 2 die jeweiligen Transistoren durchschalten die einmal die Versorgung der Beleuchtung und einmal das Rechtecksignal des Blinkens weiterleiten.
Aus dem Kopf raus müsste man da mit 2 Flipflops und einem Exklusiv-Oder hinkommen.
Wäre vermutlich auch eine interesannte Prä-Computer Lösungsvariante der Aufgabenstellung.
Geändert von i_make_it (03.03.2017 um 19:43 Uhr)
das hier klingt auch interessant.
klick
Je tiefer ich da reingucke, umso undurchsichtiger wird es, find ich.
Ich hatte ganz früher mal mit meinem C64 kleine Programme in Basic geschrieben. Lang ist es her. Ein paar Sachen kann ich mit Probieren anpassen, dann hört es aber schon wieder auf. Ich verstehe den Aufbau und die Zusammenhänge nur bedingt. Wie gesagt die 2 AT2313 Variante wäre mir auch recht, die hätte ich da und müsste nicht erst noch Teile bestellen.
Dein anderer Lösungsvorschlag hat mir gezeigt, dass ich mal sowas von den falschen Ausbildungsweg eingeschlagen bin. Ich musste 90% davon googlen.
Lesezeichen