PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED Blinken lassen



FuturamaFry
16.10.2013, 12:14
Hallo,

kann mir jemand weiterhelfen. Ich bin noch richtiger Anfänger auf dem Gebiet „Programmieren mit C“. Vorher habe ich viel mit Basic (C-Control von Conrad) Programmiert.


Ich habe jetzt folgende Schaltung aufgebaut:
ATMega8A mit einem 8Mhz Quarz und eine LED an Port12(PD6) (natürlich mit Vorwiederstand).


Ich möchte jetzt das die LED erst eingeschaltet wird und dann nach einer Sekunde wieder ausgeschaltet wird. Das ganze dann in einer schleife.

In Basic so;

define LED Port[12]

#Start

Port12 = on
pause 50
Port12 = off

goto Start


Kann mir das jemand in C umschreiben?


Gruss

Arkon
16.10.2013, 12:32
Ähm....nein.....

Das ist das "Hello World" der µC-Programmierung und mit Tante Google garantiert auch mit den unsinnigsten Stichwörtern auf der ersten Startseite vertreten ;)

oberallgeier
16.10.2013, 13:35
... LED erst eingeschaltet ... nach einer Sekunde ... aus ... Kann mir das jemand in C umschreiben
Ähm....nein.....Schade dass Arkon das Dir das nicht umschreiben kann. Kann hier fast jeder - aber vielleicht interpretierst Du Arkons Bemerkung als lehrerhafte de-Motivation - und schaust Dir trotzdem diese Hilfe (klick mal) (http://www.rn-wissen.de/index.php/C-Tutorial#Aufbau_eines_C-Programmes) an als Einführung in eine kleine Programmstruktur oder diesen Abschnitt (nochnklick) (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29)zur Waitfunktion.

Annahme : Du benutzt den GCC-Compiler in WINAVR. Hier ein langatmiger Code, sehr einfach aufgebaut, mit allerlei nötigen Initialisierungen und Einbindungen von den benutzten GCC-bibliotheken und reichlich Kommentar (hoffentlich nicht zuu unübersichtlich):
/* >>
Stand ...
================================================== ============================== =
Target MCU :
Target Hardware :
Target cpu-frequ. :
================================================== ============================== =
Enthaltene Routinen :
int main(void)
================================================== ============================== =
*** Versionsgeschichte:
====================
x00 15Okt13 hhmm
================================================== ============================== =
*** Aufgabenstellung : LED blinken lassen
######>>>>>> Bis hierher eigentlich nur Beschreibungen, damit man später weiß, was .....
================================================== ============================= */
// Die nötigen Bibliotheken einbinden
#include <stdlib.h>
#include <util/delay.h> // in älteren avr-libc Versionen <avr/delay.h>
// ================================================== ============================ =

// ================================================== ============================ =
// === HAUPTProgramm ================================================== ========= =
// Initialisierungen, LED blinken lassen im 1 sek takt
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main(void)
{ //
// - - - - - - - - - - - - - - -
// Ports+Pins als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b11111100; // Testweise bzw. Demo für Eingang
PORTB = 0b00000011; // .. mit Pullup
//
DDRC = 0b11111111; //
PORTC = 0b00000000; //
//
DDRD = 0b11111111; // PD6 mit LED; geschaltet Anode<->Portpin, Kathode<->GND
PORTD = 0b00000000; //
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
while ( 1 ) // Beginn einer Endlosschleife
{ //
PORTD |= ( 1<<PB6 ); // LED anknippsen <=> Setzt Portpin PB6 auf high
_delay_ms( 1000 ); // Bibliotheksfunktion Millisekunden-Waits,
// .. hier 1000 ms
PORTD &= ~( 1<<PB6 ); // LED ausknippsen <=> Setzt Portpin PB6 auf low
// .. heisst sozusagen: Portpin wird gelöscht
_delay_ms( 1000 ); //
} // Ende while ( 1 )
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return 0; //
} // Ende int main(void)
// ================================================== ============================ =

Das geht natürlich vom eigentlichen Programmm, dem modul main, einfacher, weil man so einen Port einfach umschalten kann - da spart man Codezeilen (und natürlich auch Maschinenzeit).
//* >>
Stand ...
================================================== ============================== =
Target MCU :
Target Hardware :
Target cpu-frequ. :
================================================== ============================== =
Enthaltene Routinen :
int main(void)
================================================== ============================== =
*** Versionsgeschichte:
====================
x00 15Okt13 hhmm
================================================== ============================== =
*** Aufgabenstellung : LED blinken lassen
================================================== ============================= */
#include <stdlib.h>
#include <util/delay.h> // in älteren avr-libc Versionen <avr/delay.h>
// ================================================== ============================ =

// ================================================== ============================ =
// === HAUPTProgramm ================================================== ========= =
// Initialisierungen, LED blinken lassen im 1 sek takt
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main(void)
{ //
// - - - - - - - - - - - - - - -
// Ports+Pins als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b11111100; // Testweise bzw. Demo für Eingang
PORTB = 0b00000011; // .. mit Pullup
//
DDRC = 0b11111111; //
PORTC = 0b00000000; //
//
DDRD = 0b11111111; // PD6 mit LED; geschaltet Anode<->Portpin, Kathode<->GND
PORTD = 0b00000000; //
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
while ( 1 ) // Beginn einer Endlosschleife
{ //
PORTD ^= ( 1<<PB6 ); // LED toggeln <=> Setzt Portpin PB6 auf den
// jeweils anderen Zustand (umschalten low-high)
_delay_ms( 1000 ); // Bibliotheksfunktion Millisekunden-Waits,
// .. hier 1000 ms
} // Ende while ( 1 )
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
return 0; //
} // Ende int main(void)
// ================================================== ============================ =

Maschinenzeit: das Beispiel ist wirklich nur ein Beispiel - es zeigt, wie man einen flinken Controller lahmlegt, weil man einfach nur wartet und wartet und wartet und wartet und wartet und wartet und wartet und wartet und ne LED schaltet und wartet und wartet und wartet und wartet und wartet und ne LED...

Arkon
16.10.2013, 14:18
Na komm. So böse war das jetzt nicht gemeint. Aber wenn jemand in diesem Forum nach eienr Komplettlösung für sein Projekt fragt wird immer betont, dass wir helfen aber nicht vorkauen.

Und diese grundlegende Funktion ist nun wirklich Bestandteil aller ernst zu nehmenden µC-Tutorials, das mir bisher unter gekommen ist. In meinen Augen wurde auch hier nur der bequeme Weg gewählt andere für sich arbeiten zu lassen, ohne vorher per 5-Minuten-Google-Recherche den benötigten Aufwand abzuschätzen. Zumal durch die Präsentation von fertigem Code auch der Punkt zu tragen kommt den einer meiner Professoren immer von sich gab: "Kopiert ist nicht gleich kapiert!"

Ich hätte schreiben sollen: Ich kann es dir umschreiben, will ich aber nicht. Das wäre dann weniger unfähig dafür noch arroganter rüber gekommen ;)

FuturamaFry
17.10.2013, 09:53
Vielen dank für die Hilfe !

Ich habe vorher hier in Forum und auf google geschaut. Ein paar Beispiele habe ich auch gefunden (die aber irgendwie alle nicht funktioniert haben) weil sie entweder mit einer anderen Programmiersprache geschrieben waren oder für ein anderen Chip.

Ich habe jetzt seit 3 Tagen das aTeVal und war schon am ersten Tag am verzweifeln weil mein PC das Board nicht erkannt hat. Habe erst schon gedacht ich hätte beim Löten ein Fehler gemacht (das Board kommt als Bausatz). Dann hat mein Rechner endlich das Board als „AVRISP mkII“ erkannt. Als nächstes kam dann die Programmiersoftware. In manchen Foren wird richtig darüber gestritten welches die beste und „Für Anfänger geeignete“ Programmiersprache ist. Nach vielen Installationen, PC Neustarts und Deinstallationen habe ich mich für das Atmel Studio 6.0 entschieden. Nach vielen Youtube Videos, wusste ich dann auch wie man das Programm auf den Chip Brennen kann (wie gesagt blutiger Anfänger).

Und um alles dann zu testen und Treiber- und Lötfehler aus zu schließen wollte ich ein Programm das in meiner Programmiersprache und für mein Chip ist.


"Kopiert ist nicht gleich kapiert!"
Jaein. Irgendwie muss ich ja anfangen. Anhand von Beispielen kann man doch am besten lernen :)

Jetzt weiß ich wie die Befehle aussehen ein Port auf high und low zu setzten und wie der Befehl für Pause ist. Es kann weiter gehen.