Hallo Guten Tag :) Ich habe mir einen Atmega8 besorgt, einen kleinen USB Programmierer und das auch alles zum Laufen bekommen, mit dem Atmel Studio 7. Den ersten Code habe ich auch schon hochgeladen (Momentan eine LED die SOS blinkt) Ich weiß leider nicht, ob ich hier richtig bin mit meinem Anliegen. Ich würde hier gerne meine kleinen Fortschritte vorstellen und Fragen stellen, warum dies und jenes gerade nicht funktioniert...vielleicht macht sich ja jemand die Mühe, mir dabei behilflich zu sein und mir über die Schulter zu schauen. Ich fange einfach mal an, ein Bild von meinem kleinen Projekt zu posten und den dazugehörigen Code: Die LED ist am pin C5, der als ausgang definiert ist, dranne. Diese funktioniert auch und blinkt im SOS-Modus Der Pin C4 direkt da drunter soll als Eingang definiert sein. Wenn ich jetzt durch den Button ein High signal an pin C4 schicke, soll die LED im SOS Modus blinken...diese blinkt aber unabhängig von dem Button dauerhaft im SOS Modus. Die Blaue LED leuchtet, wenn ich den Button drücke, dieser funktioniert also..jemand eine Ahnung wo der Fehler ist :)? code: // MyAtmelBlink.c // put LED on PC5 #ifndef F_CPU // if F_CPU was not defined in Project -> Properties #define F_CPU 1000000UL // define it now as 1 MHz unsigned long #endif #include <avr/io.h> // this is always included in AVR programs #include <util/delay.h> // add this to use the delay function //////////////////////////////////////////////////////////////////////// /////////////////////////// int main(void) { DDRC |= (1 << PC5); // set Port C pin PC5 for output DDRC &= ~(1 << PC4); // set Port C pin PC4 for intput while (1) { // begin infinite loop if (PORTC ^= (1 << PC4)) { PORTC &= ~(1 << PC5); } else { PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(250); // delay 1/2 second PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(250); // delay 1/2 second PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(250); // delay 1/2 second PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(1000); PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(1000); PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(1000); PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(250); // delay 1/2 second PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(250); // delay 1/2 second PORTC &= ~(1 << PC5); _delay_ms(250); PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(250); // delay 1/2 second PORTC &= ~(1 << PC5); _delay_ms(5000); } } return(0); // should never get here, this is to prevent a compiler warning }
der Code als Code:
1 | // put LED on PC5
|
2 | |
3 | #ifndef F_CPU // if F_CPU was not defined in Project
|
4 | -> Properties |
5 | #define F_CPU 1000000UL // define it now as 1 MHz unsigned
|
6 | long
|
7 | #endif
|
8 | |
9 | #include <avr/io.h> // this is always included in AVR |
10 | programs
|
11 | #include <util/delay.h> // add this to use the delay function |
12 | |
13 | ////////////////////////////////////////////////////////////////////////
|
14 | ///////////////////////////
|
15 | int main(void) { |
16 | |
17 | DDRC |= (1 << PC5); // set Port C pin PC5 for output |
18 | DDRC &= ~(1 << PC4); // set Port C pin PC4 for intput |
19 | |
20 | while (1) |
21 | { // begin infinite loop |
22 | if (PORTC ^= (1 << PC4)) |
23 | {
|
24 | PORTC &= ~(1 << PC5); |
25 | }
|
26 | else
|
27 | {
|
28 | |
29 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
30 | _delay_ms(250); // delay 1/2 second |
31 | PORTC &= ~(1 << PC5); |
32 | _delay_ms(250); |
33 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
34 | _delay_ms(250); // delay 1/2 second |
35 | PORTC &= ~(1 << PC5); |
36 | _delay_ms(250); |
37 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
38 | _delay_ms(250); // delay 1/2 second |
39 | PORTC &= ~(1 << PC5); |
40 | _delay_ms(250); |
41 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
42 | _delay_ms(1000); |
43 | PORTC &= ~(1 << PC5); |
44 | _delay_ms(250); |
45 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
46 | _delay_ms(1000); |
47 | PORTC &= ~(1 << PC5); |
48 | _delay_ms(250); |
49 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
50 | _delay_ms(1000); |
51 | PORTC &= ~(1 << PC5); |
52 | _delay_ms(250); |
53 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
54 | _delay_ms(250); // delay 1/2 second |
55 | PORTC &= ~(1 << PC5); |
56 | _delay_ms(250); |
57 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
58 | _delay_ms(250); // delay 1/2 second |
59 | PORTC &= ~(1 << PC5); |
60 | _delay_ms(250); |
61 | PORTC ^= (1 << PC5); // flip state of LED on PC5 |
62 | _delay_ms(250); // delay 1/2 second |
63 | PORTC &= ~(1 << PC5); |
64 | _delay_ms(5000); |
65 | |
66 | |
67 | }
|
68 | }
|
69 | return(0); // should never get here, this is to |
70 | prevent a compiler warning |
71 | }
|
Mario K. schrieb: > if (PORTC ^= (1 << PC4)) Das ist keine Frage, das ist eine Zuweisung. Damit toggelst du Pin C4 am Port C. Die Abfrage müsst sein
1 | if(PINC & (1<<PINC4){ |
2 | PORTC &= ~(1 << PC5); |
3 | }
|
4 | else { |
5 | ...
|
6 | }
|
Und an den ATMega gehört ein Abblock-Kondensator! Auch auf einem Steckbrett!
Harry L. schrieb: > Und an den ATMega gehört ein Abblock-Kondensator! Der übliche Fehler. Ich habe noch zwei gesehen: Die LED hat keinen wirksamen Vorwiderstand, weil der durch das Steckbrett überbrückt wird. Die fünf Kontakte in der Reihe sind (wie in allen Reihen) direkt miteinander verbunden! Die gelbe Leitung vom Taster wird keine ordentlichen Signalpegel haben. Wenn der Taster gedrückt ist hast du dort die Betriebsspannung der LED (ca 3V) und wenn der Taster losgelassen wird, hast du eine zufällige Spannung zwischen 0 und 3V. Das musst du ganz anders beschalten:
1 | Taster |
2 | ____ 10k |
3 | +5V o------ -------+---[===]---------| GND |
4 | | |
5 | +---|>|---[===]---| |
6 | | LED |
7 | o |
8 | zum AVR |
Na ja, da musst Du schon mal ca. 11,5 Sekunden drücken oder den richtigen Moment zum Drücken abpassen. Dein SOS wird "durchgezogen" - Taste gedrückt oder nicht. Der Prozessor arbeitet alle Anweisungen im ELSE-Zweig ab - incl. der delays, bevor er die Taste abfragt (mal abgesehen von den anderen Problemen).
Stefan S. schrieb: > Mario K. schrieb: >> if (PORTC ^= (1 << PC4)) > > Das ist keine Frage, das ist eine Zuweisung. Damit toggelst du Pin C4 am > Port C. > > Die Abfrage müsst sein >
1 | > if(PINC & (1<<PINC4){ |
2 | > PORTC &= ~(1 << PC5); |
3 | > } |
4 | > else { |
5 | > ... |
6 | > } |
7 | >
|
danke :) Stefanus F. schrieb: > Harry L. schrieb: >> Und an den ATMega gehört ein Abblock-Kondensator! > > Der übliche Fehler. > > Ich habe noch zwei gesehen: Die LED hat keinen wirksamen Vorwiderstand, > weil der durch das Steckbrett überbrückt wird. Die fünf Kontakte in der > Reihe sind (wie in allen Reihen) direkt miteinander verbunden! > > Die gelbe Leitung vom Taster wird keine ordentlichen Signalpegel haben. > Wenn der Taster gedrückt ist hast du dort die Betriebsspannung der LED > (ca 3V) und wenn der Taster losgelassen wird, hast du eine zufällige > Spannung zwischen 0 und 3V. > > Das musst du ganz anders beschalten: > >
1 | > Taster |
2 | > ____ 10k |
3 | > +5V o------ -------+---[===]---------| GND |
4 | > | |
5 | > +---|>|---[===]---| |
6 | > | LED |
7 | > o |
8 | > zum AVR |
9 | > |
Ich bin etwas verwirrt...ich habe doch einen Kondensator verbaut? zw + und dem Power Supply pin vom Atmega Ansonsten danke für den Schaltplan :)
Du hast einen Elko verbaut. Elkos sind gewickelt, haben daher eine hohe Induktivität und sind für hochfrequente Störungen unwirksam. Der Elko macht Sinn, aber er muss durch einen kleinen Keramik-Kondensator unterstützt werden - typischerweise 100nF. Und: Der gehört direkt an den Mikrocontroller, weil die Leitungen und Kontakte vom Steckbrett störende Übergangswiderstände und Induktivitäten haben. Da dein Controller zwei Pin-Paare zur Stromversorgung hat, brauchst du sogar zwei Keramik-Kondensatoren.
Mario K. schrieb: > Ich bin etwas verwirrt...ich habe doch einen Kondensator verbaut? zw + > und dem Power Supply pin vom Atmega Aber keinen Kerko mit 100nF so nahe wie möglich an den Pins. Sieht das nur so aus, oder befinden sich beide Beine des Elkos auf der GNDschiene? Außerdem wäre es sehr Ratsam den Reset-Pin mit einem Pull up Widerstand und optional einem 100nF Kerko nach GND zu versehen. siehe auch Appnote AVR042 http://ww1.microchip.com/downloads/en/appnotes/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf
:
Bearbeitet durch User
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.