PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster reagieren nur schleppend



AtmegaNeuling
23.12.2013, 18:26
Hallo Forumsgemeinde,


Ich bin ein AVR Greenhorn, dass mit C und einem ATmega8 zur Zeit am
experimentieren ist.

Mein Problem sieht zur Zeit wie folgt aus:

Ich arbeite mich in die Region der Timer und Taster vor.

Mein Problem liegt zur Zeit darin, dass meine Taster nie wirklich auf Anhieb reagieren.....Sie sind gegen GND geschaltet und am µC die Pullups aktiviert. Ansprechen tue ich sie mit

if (bit_is_clear)......

Wie baue ich ein Taster, der egal an welcher Stelle das Programm sich befindet, reagiert wenn er gedrückt wird???


Vielen Dank im Voraus für eure Hilfe

BMS
23.12.2013, 19:50
Hallo und willkommen im Roboternetz :Weihnacht
Taster gegen GND und Pullup klingt auf jeden Fall schon richtig.
Eventuell hast du ja eine ungünstige Verschachtelung oder Wartezeiten im Programm, die die Abarbeitung stören.
Für eine Diagnose wäre ein Codeausschnitt praktisch, damit wir das nachvollziehen können ;)
Zu beachten wäre auch noch, dass Taster prellen können, d.h. bei einem Tastendruck sind meist mehrere Impulse messbar.

Wie baue ich ein Taster, der egal an welcher Stelle das Programm sich befindet, reagiert wenn er gedrückt wird???
Das wiederum kann man mit Interrupts lösen. Oder das Programm geeignet umstellen.
Grüße, Bernhard

Hubert.G
23.12.2013, 19:56
Es gibt grundsätzlich zwei Möglichkeiten eine Taste abzufragen.
Die eine ist per Interrupt, wenn es mehrere Tasten sind muss man sich beim Mega8 was einfallen lassen, neuere wie Mega88 haben bereits ein Pinchange-Interrupt.
Die andere Möglichkeit ist Pollen. Hier werden bei jedem Programmdurchlauf die Tasten abgefragt. Dafür muss das Programm allerdings optimal laufen, also keine delay, lange while, usw.
Dein if(bit is clear) deutet auf einen älteren Compiler hin, vielleicht mal Üpdaten.

AtmegaNeuling
25.12.2013, 08:53
Ich baue zur Zeit eine Tischuhr.....also das Programm ist sehr überschaubar.....Aber wenn die Taster die Variablen, also die Uhr stellen sollen oder die Uhr genau einstellen, dann gibts halt schon Probleme wenn die Taster nicht auf Anhieb funktionieren.

Aus diesem Grund würde ich das gerne über Interrupts machen, allerdings habe ich damit 0 Erfahrung, da müsstet ihr mir helfen!!!

Ich Programmiere mit dem AVR-Studio 5.1

Stone
25.12.2013, 19:49
Würde auch kein bisschen schaden wenn du den aktuellen Code mal posten würdest ;).


Gruß Matthias

AtmegaNeuling
27.12.2013, 11:29
Nun ja, dann bitte:



volatile int tc;
char hr=00, min=0, sec=0;
char str[5];

ISR(TIMER1_OVF_vect)
{ TCNT1 = 34286; tc++;
}

int main(void)
{ TIMSK |= _BV(TOIE1); // aktivate overflowinterrupts of timer1
TCCR1B |= (1<<CS12); // prescaler = 256
TCNT1 = 0xFFFF; // FFFF for start
sei();

while(1)
{
sec=tc;
if (sec==60)
{ tc=0; sec=0; min++;
if (min==60) {min=0; hr++; if (hr==24) hr=0;}
sprintf(str,"%02d",min); lcd_set_cursor (1, 7); lcd_write (str);
sprintf(str,"%02d",hr); lcd_set_cursor (1, 4); lcd_write (str);
}
sprintf(str,"%02d",sec); lcd_set_cursor (1, 10); lcd_write (str);
while(sec == tc);
}
return(0);
}


Die Frage dann nochmal......wie sage ich dem Timer mit einem Taster: Jetzt starte und jetzt stoppe....und das Ganze Interrupt gesteuert, damit er direkt reagiert??

shedepe
27.12.2013, 11:51
Und nun erzählst du bitte wo du der Meinung bist einen Taster auszulesen. Davon ist in deinem Code nämlich nichts zu finden. Zum Thema Tasterauslesen gibt es 2 Möglichkeiten:
1. Gepollt:


//Zuerst: Pullups auf High und Pin auf Eingang setzen

if(!(PINX & (1<<PXX)))
{
_delay_ms(100); //Zum Entprellen
if(!(PINX & (1<<PXX)))
{
//Pin wurde gedrückt
}
}



2. Interrupt basiert: (Ich skizziere nur kurz das Vorgehen)
2.1 Man hängt den Taster an einen der Interrupt Pins (INT0 oder INT1)
2.2 Man Programmiert den Interrupt handler für INT0 oder INT1
2.3 Man Programmiert die Einstellungsregister für INT0 oder INT1

Zum Timer:
Der Timer startet bzw. stopt wenn man das TCNT1 Register Programmiert.

AtmegaNeuling
29.12.2013, 17:19
Ja so oder



if (bit_is_clear()1<<PXX)
{
"Mach Was"
}



2.2 Man Programmiert den Interrupt handler für INT0 oder INT1

Das heißt ich sage ihm, dass er auf eine steigende Flanke reagieren soll???


2.3 Man Programmiert die Einstellungsregister für INT0 oder INT1

Und wie macht man das???


Der Timer startet bzw. stopt wenn man das TCNT1 Register Programmiert

Wie genau.....???

Stone
29.12.2013, 19:27
Man liest die Beschreibung der Register im Datenblatt des Atmega 8.
Hier wird dir keiner jedes Register vorkauen, da gehört schon etwas Eigeninitiative dazu.


Gruß Matthias

shedepe
29.12.2013, 22:00
Oder schaut auf mikrocontroller.net im avr-gcc tutorial nach.

AtmegaNeuling
30.12.2013, 08:36
Ich danke euch für eure Initiative, von Hilfe kann jedoch nicht die Rede sein.

Sobald es ein wenig komplizierter wird, verweist jeder auf die "Eigeninitiative" und Forumsbeiträge. Das ist schon witzig...oder traurig???

oberallgeier
30.12.2013, 09:07
... von Hilfe kann ... nicht die Rede sein ... Sobald es ein wenig komplizierter wird, verweist jeder auf die "Eigeninitiative" ...Harte Kritik - und ich kann sie nicht nachvollziehen. Immerhin hattest Du Deinen Code a) nur teilweise und b) erst im sechsten Posting vorgestellt und - ganz wichtig - c) ICH (wohl jeder hier) weiß nicht was für ein Makro Du hinter


if (bit_is_clear()1<<PXX)
versteckt hast. Denn nach Deiner wiederholten Darstellung liegt Dein Problem in der Abarbeitung beim Tastendruck und GENAU DEN hast Du noch nicht nachvollziehbar vorgelegt. Und deswegen kann man Dir auch nicht wirklich sinnvoll helfen! Da hilft auch kein Vorwurf wegen mangelnder Hilfbereitschaft. Ich sehe das Thema mangelnder Hilfe eher an der zögerlichen und ungenügenden Problembeschreibung.


Würde auch kein bisschen schaden wenn du den aktuellen Code mal posten würdest ...
... wo du der Meinung bist einen Taster auszulesen. Davon ist in deinem Code nämlich nichts zu finden ...Wo im Code ist immer noch unklar und, wie schon gesagt, was hinter dem Makro steckt kann nur vermutet werden.

shedepe
30.12.2013, 10:51
Und der Verweis auf das Atmega Datenblatt (Dessen Lektüre eigentlich selbstverständlich sein sollte) ist durchaus legitim. Ich will dir trotzdem mal kurz die richtigen Links zusammenstellen. Allgemein Interrupts https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ISR Weiter unten steht auch die Register beschreibung von einem At90 drin. Im Atmega32 Datenblatt (Atmega32 hab ich einfach mal beispielshalber jetzt ausgewählt) Interrupts: Seite 44 External Interrupts ( das was du willst): Seite 66 Interressant zum programmieren ist meist nur die Registerbelegung Seite 68 Und ein Beispiel in C: http://www.avr-tutorials.com/interrupts/avr-external-interrupt-c-programming

oberallgeier
03.01.2014, 08:49
Ich danke euch für eure Initiative, von Hilfe kann jedoch nicht die Rede sein ...
... Ich will dir trotzdem mal kurz die richtigen Links zusammenstellen ...
Ich weiß nicht ob unsere Hilfe Sinn macht. Ist wohl der gleiche Anfänger der schon vor drei Jahren beim mikrocontrollernet bemerkenswerte Fragen gestellt (http://www.mikrocontroller.net/topic/196101#1920800) hat.

chrisavr1981
05.01.2014, 17:11
Hallo zusammen,

darf ich sagen, und wahrscheinlich habt ihr das schon längst mitbekommen, dass der Code aus dem Buch "AVR Mikrocontroller in C-Programmieren" stammt und zwar geht es hier um die Tagesschau Uhr. :-(.
Ich weiß, dass sich Codes meistens wiederholen oder auch "fast" gleich geschrieben sein können aber selbst die Anordnung ist die gleiche Art.
Der Autor in diesem Buch hat eine schreckliche Art Scripte zu schreiben, alles auf einer Zeile und viele Variablen sind nicht selbsterklärend, vor allem nicht, wenn man gerade anfängt für Microcontroller zu programmieren.

HeXPloreR
05.01.2014, 17:30
Hallo zusammen,

darf ich sagen, und wahrscheinlich habt ihr das schon längst mitbekommen, dass der Code aus dem Buch "AVR Mikrocontroller in C-Programmieren" stammt und zwar geht es hier um die Tagesschau Uhr. :-(.

Ja, das ist korrekt - es ist anscheinend der "selbe" Code - aber was ist jetzt so traurig daran? Vielleicht das der Threadstarter einfach die Hälfte vom Code (sämtlicher Header einbindungen) im Post#6 weggelassen hat?
Das der Thraedstarter nicht mal sicher sagen kann das seine Hardware auch mit den 8MHz Quarz läuft? Und somit der Timer korrekt für diese Frequenz vorgeladen wird?
Und dass das erweitern dieser Uhr mit Taster zum einstellen ein Erweiterungsvorschlag ist? Der Threadstarter bishierhin nicht mal ansatzweise eine Taster programmiert hat?

Ansonsten sieht für mich die schreibweise des Autors nicht so schlecht aus. Vielleicht sollte man nicht einfach in irgendein Projekt reinspringen, solange man sich nicht einigermassen mit der Materie auskennt. Variablen wie hr = 20 , min = 0, sec = 0, tc in bezug auf Timer ...finde ich sind im bezug zur Aufgabe bzw Uhrzeit recht aussagekräftig genug.

Manche Teile in einem C.Code sind aber nicht extra vom Programmierer gemacht worden, er benutzt sie nur "Hardware" nah: Das sind dann Register wie TIMER1 oder TCNT1. Da hilft es nur sich Stück für Stück in diese Dinge einzuarbeiten damit man die Register und Schreibweise sowie die Benutzung kennelernt.

1. Ein Ledblinker Projekt mit wait
2. Interrupt; z.B. wait wird abgebrochen auf 1.
3. Timer auf 2. ohne wait