Forum: Mikrocontroller und Digitale Elektronik Atmel Studio Absolut Beginner Coding programmierfragen


von Chris Telmeth (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Mario K. (christelmeth)


Lesenswert?

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
}

von Stefan S. (chiefeinherjar)


Lesenswert?

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
}

von Harry L. (mysth)


Lesenswert?

Und an den ATMega gehört ein Abblock-Kondensator!

Auch auf einem Steckbrett!

von Stefan F. (Gast)


Lesenswert?

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

von Hugo H. (hugohurtig1)


Lesenswert?

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).

von Mario K. (christelmeth)


Lesenswert?

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 :)

von Stefan F. (Gast)


Lesenswert?

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.

von Franz M. (elmo64)


Lesenswert?

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
Noch kein Account? Hier anmelden.