Hallo ich habe da so eine komische frage:) ich bin noch neu in diesem gebiet und wollte mal etwas fragen... ich habe auf meinem experimentier board 3 leds und sobald ich auf die taste klicke leuchen diese leds... was jetzt aber das porblem ist das wenn ich auf die taste klicke dann wird PC0 auf Masse geschlossen und dann führt mein atme8 eine aktion durch... Ich würde aber gerne die Taste nicht auf masse schliesen sondern auf VCC... damit meine ich das wenn ich auf die taste klicke fliest eine 5V spannung in den PORT PC0 hinein... wie kann ich das abfragen? wie kann ich dem atmega sagen das er auf PC0 warten soll bis eine spannung reinfliest und fals eine fliest soll er eine aktion durchführen?
Zuersteinmal solltest du uns etwas über deinhe Programmierumgebung erzählen, da dir sonst niemand wirklich helfen kann. z.B: Welche Sprache (basic, c, asm) welches Board (stk500 o.ä.) Mfg Pase
Samet Yildirim schrieb: > ich habe auf meinem experimentier > board 3 leds und sobald ich auf die taste klicke leuchen diese leds... Dann versuche doch erstmal, diesen Code zu verstehen, d.h. warum er so funktioniert. Es hat keinen Zweck, wenn Dir jemand ne Lösung gibt, die Du dann auch nicht kapierst. > was jetzt aber das porblem ist das wenn ich auf die taste klicke dann > wird PC0 auf Masse geschlossen und dann führt mein atme8 eine aktion > durch... Dann überlege mal, warum derjenige das so gemacht hat (siehe Datasheet, Stichwort Input mit internem Pullup). Er war jedenfalls nicht dumm. > Ich würde aber gerne die Taste nicht auf masse schliesen > sondern auf VCC... Kann man machen. Aber wie kommt dann low-Pegel auf den Pin, wenn die Taste nicht gedrückt ist ??? > damit meine ich das wenn ich auf die taste klicke > fliest eine 5V spannung in den PORT PC0 hinein... wie kann ich das > abfragen? Nachdem Du Deinen Beispielcode verstanden hast, weißt Du es selber. > wie kann ich dem atmega sagen das er auf PC0 warten soll bis > eine spannung reinfliest und fals eine fliest soll er eine aktion > durchführen? Spannung fließt niemals! Es fließen nur kurzzeitig Umladeströme um die parasitäre Pin-Kapazität umzuladen. D.h. für low- und auch high-Pegel mußt Du einen (sehr kleinen) Strom bereitstellen. Peter
Samet Yildirim schrieb: > was jetzt aber das porblem ist das wenn ich auf die taste klicke dann > wird PC0 auf Masse geschlossen und dann führt mein atme8 eine aktion > durch... Also ist im Ruhezustand (Taste nicht gedrückt) PC0 mit Vcc verbunden: active low. Zur Verbindung wird i.d.R. ein Pull-up-Widerstand verwendet. Der kann innerhalb des Atmega sitzen oder außerhalb (externer Pull-up). Linkes Bild in http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter > Ich würde aber gerne die Taste nicht auf masse schliesen > sondern auf VCC... damit meine ich das wenn ich auf die taste klicke > fliest eine 5V spannung in den PORT PC0 hinein... Also eine active high Schaltung Rechtes Bild in http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter > wie kann ich das > abfragen? Indem du die umgekehrte Logik wie bei der bisherige Abfrage benutzt und die Hardware entsprechend umbaust. Ggf. muss auch das Programm verändert werden, wenn interne Pull-Ups (s.o.) benutzt wurden. Leider fehlt dein Programm, so dass man die bisherige Abfrage nicht sieht. Je nach Programmiersprache ist es mehr oder minder kompliziert die Befehlslogik "umzudrehen". Fang ruhig an und überlege dir was du umbauen und umprogrammieren willst. Wenn du Bedenken hast das auf deinem Board umzusetzen, frag vorher, ob du alles richtig gemacht hast. Denke aber daran, dass wir hier Quellcodes und Schaltpläne mehr als missverständliche Beschreibungen in Prosa lieben! Wenn du obiges gelöst hast, erklärt sich das folgende "von selbst" > wie kann ich dem atmega sagen das er auf PC0 warten soll bis > eine spannung reinfliest und fals eine fliest soll er eine aktion > durchführen?
Bedanke mich für die schnellen antworten hat mir wirklich weiter geholfen... ich habe kein beispiel code verwendet ich habe das so weit bis jetzt selber gemacht... ich werde euch mal den code von mir schicken wie es ausschaut... BITTE NICHT AUSZUCKEN KÖNNTE SEIN DAS DER CODE DURCHEINANDER IST und anfäger mäsig programmiert ist aber ich poste ihn trozdem einmal.
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #include <stdint.h> |
4 | #ifndef F_CPU
|
5 | /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
|
6 | (z.B. durch Übergabe als Parameter zum Compiler innerhalb
|
7 | des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
|
8 | "nachträgliche" Definition hinweist */
|
9 | #define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */ |
10 | #endif
|
11 | #include <util/delay.h> |
12 | |
13 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) |
14 | {
|
15 | if ( ! (*port & (1 << pin)) ) |
16 | {
|
17 | /* Pin wurde auf Masse gezogen, 100ms warten */
|
18 | //_delay_ms(50); // max. 262.1 ms / F_CPU in MHz
|
19 | //_delay_ms(50);
|
20 | //if ( *port & (1 << pin) )
|
21 | //{
|
22 | /* Anwender Zeit zum Loslassen des Tasters geben */
|
23 | //_delay_ms(50);
|
24 | //_delay_ms(50);
|
25 | //return 1;
|
26 | //}
|
27 | return 1; |
28 | }
|
29 | return 0; |
30 | }
|
31 | |
32 | void ampel(){ |
33 | PORTB |= (1 << PB2); // Toggle PB0 z.B. angeschlossene LED |
34 | _delay_ms(1000); // Eine Sekunde +/-1/10000 Sekunde warten... |
35 | PORTB |= (1 << PB1); |
36 | _delay_ms(300); // funktioniert nicht mit Bibliotheken vor 1.6 |
37 | PORTB &= ~(1 << PB1); |
38 | PORTB &= ~(1 << PB2); |
39 | PORTB |= (1 << PB0); |
40 | _delay_ms(1000); |
41 | PORTB &= ~(1 << PB0); |
42 | _delay_ms(100); |
43 | PORTB |= (1 << PB0); |
44 | _delay_ms(100); |
45 | PORTB &= ~(1 << PB0); |
46 | _delay_ms(100); |
47 | PORTB |= (1 << PB0); |
48 | _delay_ms(100); |
49 | PORTB &= ~(1 << PB0); |
50 | _delay_ms(100); |
51 | PORTB |= (1 << PB1); |
52 | _delay_ms(500); |
53 | PORTB &= ~(1 << PB1); |
54 | PORTB |= (1 << PB2); |
55 | _delay_ms(100); |
56 | PORTB &= ~(1 << PB2); |
57 | }
|
58 | |
59 | int main( void ) |
60 | {
|
61 | DDRB |= ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen |
62 | DDRB |= ( 1 << PB1 ); |
63 | DDRB |= ( 1 << PB2 ); |
64 | DDRC &= ~( 1 << PC0 ); |
65 | PORTC |= ( 1 << PC0 ); |
66 | |
67 | while( 1 ) { // Endlosschleife |
68 | |
69 | if (debounce(&PINC, PC0)){ |
70 | ampel(); |
71 | |
72 | }
|
73 | }
|
74 | return 0; |
75 | }
|
also was ich eigentlich VERMUTE WAS VERÄNDERT GEHÖRT ist dieser teil oder?
1 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) |
2 | {
|
3 | if ( ! (*port & (1 << pin)) ) |
4 | {
|
Quellcode zeigen ist eine gute Idee. Im allgemeinen wird der auch nicht "zerrissen" (außer der TO bettelt darum :-) > DDRC &= ~( 1 << PC0 ); // Eingang: Taster an PC0 > PORTC |= ( 1 << PC0 ); // interner Pull-up aktiviert > if ( debounce(&PINC, PC0) != 0 ) // ausführliche Schreibweise Wenn du die Schaltung so wie im rechten Bild oben aufgebaut hast, also active high Taster mit externem Pull-Down Widerstand, dann änderte in: DDRC &= ~( 1 << PC0 ); // Eingang: Taster an PC0 PORTC &= ~( 1 << PC0 ); // interner Pull-Up NICHT aktiviert if ( debounce(&PINC, PC0) == 0 )
super danke hat funktioniert:) dann hätte ich noch eine kleine frage... ich würde das gerne verstehen was ich da gemacht habe... Also dieser Pullup wiederstand hängt auf masse. Was ich aber sehr komisch finde ist das ohne dem wiederstand der chip an pc0 ein signal bekommt. ich würde gerne wissen was dieser wiederstand dort ausübt? und was es bewirkt wenn es auf masse steht? DANKE FÜR DIE HILFE AN ALLE
Der Pull-Down Widerstand (Down weil es "runter" auf Spannungspotential GND 0V geht und nicht Up auf Spannungspotential Vcc z.B. +5V) sorgt einmal für eine elektrische Verbindung und zum zweiten für eine Strombegrenzung, wenn der Stromkreis aktiviert wird (Ohmsches Gesetz). Wie die Eingangsschaltung am Pin PC0 innerhalb des µCs aussieht, kannst du im Datenblatt des µCs sehen. Ohne den Pull-Down und bei nicht gedrückter Taste ist der PC0 Eingang nirgends an einem geschlossenen Stromkreis angeschlossen, d.h. er liegt auf keinem der beiden definierten Potentiale Vcc oder GND. Was der µC dann aus einen undefinierten Potential macht, ist nicht voraussehbar. Es kann irgend einer der beiden logischen Zustände HIGH (HIGH-Schwellwert bis Vcc) oder LOW (GND bis LOW-Schwellwert) oder im logisch verbotenen Gebiet sein (LOW-Schwellwert bis HIGH-Schwellwert) und "irgendein Zustand" ist für die sichere Funktion eines Programms nicht geeignet. Deshalb gibt man per Schaltung ein definiertes Ruhepotential vor: über den Widerstand eben.
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.