PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster Doppel- Dreifachbelegung Attiny2313 mit Blinkimpuls für Nixie Projekt



Jens1
01.03.2017, 16:02
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.

i_make_it
01.03.2017, 17:27
Hallo und willkomen im Forum,

Poste doch mal die Codeschnipsel.

Wenn Du auf [Erweitert] klickst, bekommst Du die Codetags um


So was

zu posten.

Dann kann Dir vermutlich erher jemand helfen.

Jens1
01.03.2017, 17:42
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 (http://www.mikrocontroller.net/topic/238040#2415780)

#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
}
}


das anschalten der LED hatte ich bereis auf einen taster reduziert. der code kommt von hier (http://duran2.de/felektro/Projekte/Microprozessoren/pollinboard.html)


#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;
}


ich hoffe das hilft weiter

i_make_it
01.03.2017, 21:18
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:


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}


Da ich mich mit dem Attiny2313 und dem C dafür nicht auskenne, kann keinen konkreten Code angeben.

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/tutorials/AVR-8-microcontrollers/ATtiny2313-tutorial/
geführt.

Danach passt die Syntax zu Amtel Studio.

Hier:
http://www.ulrichradig.de/home/uploads/images/Daten_Infos_Anleitungen/AtmelCprogramming.pdf
ab Seite 35 gibts was zu den Timern.

Hier:
https://startingelectronics.org/tutorials/AVR-8-microcontrollers/ATtiny2313-tutorial/P8-TC0-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.

Jens1
01.03.2017, 23:13
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

i_make_it
02.03.2017, 08:59
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/tutorials/AVR-8-microcontrollers/ATtiny2313-tutorial/P8-TC0-polled-timer/
scheint mir ganz gut zu sein.
Das Tutorial drumrum hilft dann vermutlich auch noch mal etwas weiter.


#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);
}
}
}
}

Eventuell klinkt sich hier ja auch noch jemand ein der mit der Kombination "Attiny2313, Amtel Studio 7 und C" vertraut ist.

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.




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


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?

Jens1
02.03.2017, 19:13
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:

32457

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

Jens1
02.03.2017, 22:23
Ich hab versucht etwas zu verstehen, aber momentan hab ich information overload und versteh grad nix mehr. Ich schlaf jetzt erstmal drüber.

i_make_it
03.03.2017, 08:48
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.

Jens1
03.03.2017, 19:44
das hier klingt auch interessant.

klick (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR)

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.

i_make_it
03.03.2017, 20:09
Dein Link erklärt in Deutsch und ausführlicher das was in:
https://startingelectronics.org/tutorials/AVR-8-microcontrollers/ATtiny2313-tutorial/P8-TC0-polled-timer/
Beschrieben wird.
Mit dem Code von dort und den Erklärungen in deutsch solltest Du das Blinken mit Timern hinbekommen.

Ich habe auch mit C64 und Sinclair ZX81 angefangen.
Hab dann halt weitergemacht.
Aber meine Ausbildung ist das auch nicht. Als Werkzeugmacher und Maschinenbauer kommt nur etwas Elektrik mit Schützen und Stern-Dreieck Schaltung für Motoren in der Ausbildung vor.
Es kommt drauf an ob Du da mehr machen willst oder nur eine einmalige Lösung für ein Problem brauchst.
Willst Du zukünftig mehr mit µC's machen, macht das einlesen Sinn.
Denn Du kannst dann auch das Wissen auf andere µC's und andere Sprachen adaptieren.

i_make_it
04.03.2017, 13:32
Wo hängen eigentlich die LED's für die Beleuchtung dran?

Aus dem von Dir am Anfang geposteten Code Stücken komme ich auf:
Blinkende LED's >> PD5
Taster >> PD2 (hier wird INT0 ausgelöst. an PD3 wäre es INT1)

Jens1
04.03.2017, 15:58
Die Codes waren nur zum Testen mal auf die 5 geklemmt. Ich habe das Atmel Evalutinboard 2.01 von Pollin. da sieht man die PD5 und die PD6 blinken.
Ich dachte mir so:

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)

(Nachtrag: das mit der Masse bekomm ich ja auch über einen Transistor hin. 5V vom PD5 in die Base und dann ich der NE555 vom Collector auf den Emitter (GND) gelegt und fertig)

An die PIN´s komm ich mit minimalsten Aufwand zum verlöten ran. Die anderen würden auch gehen, kostet nen bisschen mehr Arbeit, aber wenn es nicht anders gehen sollte, wäre das auch kein Problem.




Momentan benötige ich nur eine einmalige Lösung des Problems. Momentan ist nicht die Zeit C oder eine andere Sprache zu lernen. Und ich muss den Schreibtisch mal wieder aufräumen, denn da stehen momentan die Utensilien vom Uhrenbau rum. Solange dieser nicht abgeschlossen ist, sieht das aus wie auf nem Schlachtfeld. Und das gibt langsam Ärger mit der Familie, deswegen auch meine Wahl hier im Forum nachzufragen. Normalerweise versuche ich es selber bis ich geschafft habe, aber diesmal fehlt die Zeit.
Da mich diese Situation anbricht, werde ich auf jeden Fall eine Sprache von Grund auf lernen, da gibt es ja genügend Material im Netz. Denn da kommen sicherlich wieder neue Projekte und da will ich besser vorbereitet sein.