Forum: Mikrocontroller und Digitale Elektronik ATmega16 + ATmega32 in C Programmieren


von Roy T. (rl-b00n)


Lesenswert?

Hi Leute,
Es klingt jetzt villeicht krass, aber ich suche seit langem ein
Tutorial und finde keins. Ich habe mir ein STK500 + ATmega16 + ATmega32
gekauft und würde nun gerne einwenig damit rumspielen um mich
reinzuarbeiten. Doch leider finde ich niergens das was ich suche. Ich
suche nähmlich einen Quellcode mit einem MiniProgramm (von mir aus nur
ne LED die leuchtet wenn ich einen Taster drücke) und eine passende
Make-Datei.

Wie gesagt ich programmiere mit dem STK500 Board und benutze zum
übertragen des Codes also die AVRStudio Software und als C-Compiler
habe ich die WinAVR Soft.

Was ich jetzt brauche ich ein Miniprogramm damit ich sehe wie sowas
Strukturiert ist, eine Make-Datei (auch wegen Struktur und Parameter)
und was auh noch gut wäre, das wäre wenn ich wüsste wie ich einen
Eingang (Taster) und einen Ausgang (LED) im Programm-Code definiere.

Kurz:
uC's: ATmega16, ATmega32
Programmierer: STK500
Software: AVRStudio4
Sprache: C
Compiler: WinAVR

Suche: MiniProgramm in C + Make-Datei für ATmega16/32

von Rahul (Gast)


Lesenswert?

Für das Makefile brauchst du eigentlich nur "mfile", welches beim
WinAVR-Paket mitgeliefert wird.
Um einen Einstieg in die C-Programmierung empfiehlt sich die Tutorien
(anklickbar auf der linken Seite...)

von Ingo (Gast)


Lesenswert?

Du kannst mit AVR Studio einfach ein Projekt anlegen und wählst AVR.GCC
als Compiler aus. Den Rest (einschliesslich makefile) macht avr-studio
für Dich.

Einfache Beispiele findest Du hier im avr-gcc tutorial (siehe links auf
der linken seite)

von Roy T. (rl-b00n)


Lesenswert?

@ Rahul: Ich habe jedoch keine Ahnung und kann mir also nicht Vorstellen
was ich da einstellen muss weil die Datei muss ja an den jeweiligen
ATmega angepasst werden...

@ Ingo: Das heisst ich brauch garkeinen externen Compiler?? Ich kan
also alles mit dem AVRStudio machen??? Falls AVRStudio also alles macht
inklusive Make-File dann brauch ich ja nur noch zu wissen wie ich die
pins richtig anspreche ... Und natürlich wie so ein Programm ausehen
soll wenss fertig ist. Ich werde mir dafür mal das Tutorial
"AVR-GCC-Tutorial" ansehen...

von Rahul (Gast)


Lesenswert?

Hast du es dir schon angeguckt?
bei mfile brauchst du eigentlich nur den Controller angeben. Der Rest
ist so eingestellt, dass es schon passt (standard...). Da kann man dran
drehen, wenn man etwas mehr Erfahrung hat.
Sonst solltest du Ingos Rat folgen...

von Roy T. (rl-b00n)


Lesenswert?

jo aber wenn ich Ingos rat folge brauch ich doch die mfile nicht zu
bearbeiten oder versteh ich da wieder was nicht?

von ttt (Gast)


Lesenswert?

Nein, brauchst du nicht. Wenn du WinAvr und deas AVRS-Studio installiet
hast findet das AVR-Studio den Compiler automatisch und bietet dir bei
einem neuen Projekt an, ob du GCC oder Assembler nehmen willst. Das
Makefile erstellt der dann mehr oder weniger selbst.

von Roy T. (rl-b00n)


Lesenswert?

Boah hab jetzt mehrfach in dem Tutorial gestöbert und versteh immer noch
nur Bahnhof.

DDRx
Datenrichtungsregister für Portx.
x entspricht A, B, C, D usw. (abhängig von der Anzahl der Ports des
verwendeten AVR). Bit im Register gesetzt (1) für Ausgang, Bit gelöscht
(0) für Eingang.

PINx
Eingangsadresse für Portx.
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als
Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn
Portpin low.

PORTx
Datenregister für Portx.
Dieses Register wird verwendet, um die Ausgänge eines Ports
anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden,
koenen ueber PORTx die internen Pull-Up Widerstände aktiviert oder
deaktiviert werden (1 = aktiv).

Kann mit bitte einer erklären wie ich mit diesen Informationen was
anfangen soll? Ich möchte jetzt zb ein Programm schreiben das so
ausieht:

if (TASTER_1 == GEDRüCKT) {
LED_1 == EIN
}

das klingt simpel aber ich weiss absolut nicht wie ich sowas machen
soll???

Und Rahul hat gemeint ich bräuchte nur den uC Typ angeben in der Mfile.
Doch sieht das im Tutorial GANZ anders aus da sind sauviele Sachen
beschrieben usw...

von Karl H. (kbuchegg)


Lesenswert?

Schritt 1:
  Geh zu Atmel auf die Web-Site und hole Dir das AVR_Studio

Schritt 2:
  Hol Dir den Win-AVR (Irgendwo am Anfang des Tutorials steht
  die Web-Adress)

Schritt 3:
  Installiere beides

Schritt 4:
  Oeffne AVR-Studio und erzeuge ein neues Projekt.
  Im Zuge des Projekterstellens fragt Dich AVR-Studio
  nach der Art des Projektes. Dort waehlst Du AVR-GCC aus
  Fuer Initiali-File und Project Name waehlst Du den gleichen
  Namen aus.
  Dann klickst Du auf 'Next' und stellst ein:
  'AVR-Simulator' und 'ATMega16'
  Dann klickst Du auf Finish und AVR-Studio erstellt dir das
  Projekt und richtet es so ein, dass es fuer einen Mega16
  passt.

Schritt 5:
  Jetzt schreibst Du Dein C Program.
  Ich wuerde dir mal grundlegende Lieteratur ueber C empfehlen.
  Aber wass solls. So sieht Dein Program aus. Das schreibst du
  in das Fenster rein, das sich da geoefnet hat:

#include <avr/io.h>

int main()
{
  DDRA = 0b11111111;   /* die LED an Port A      */

  DDRB  = 0b00000000;  /* die Taster an Port B   */
  PORTB = 0b11111111;  /* die Pullupwiderstaende einschalten */

  while( 1 ) {
    PORTA = PINB;
  }
}

Schritt 5:
  Jetzt laesst du den C-Compiler das ganze mal uebersetzen.
  Dazu waehlst du den Menuepunkt 'Build / Build' aus oder
  drueckst ganz einfach 'F7'.

  Im unteren Fenster tut sich jetzt eine Menge. Die letzte
  Zeile muss dan zeigen:
  Build succeeded with 0 Warnings...

  Dann ist dein Program ersetzt worden. Wenn das ganze nicht so
  aussieht, dann hast du entweder im Vorfeld irgendwo einen
  Fehler gemacht, oder beim Abtippen des Programmes ist ein
  Fehler passiert. Korriegier ihn.

Schritt 6:
  Jetzt simulierst Du das Programm mal im AVR-Studio.
  Dazu waehlst Du den Menüpunkt 'Debug / Start Debugging'
  Grummel, Grummel, Grummel, der Debugger startet und
  bei der oeffnenden Klammer in main() erscheint ein gleber
  Pfeil. Dieser Pfeil zeigt an, welche Anweisung als naechstes
  ausgefuehrt wird. Mit F10 wird die Anweisung auch tatsaechlich
  ausgefuehrt und der Pfeil wandert eine Zeile runter zur Anweisung
  DDRA = 0b11111111;

  Fuehr die noch nicht aus, sondern schalte mal im linken Fenster
  ueber den Reiter um auf 'I/O View'.
  In der Baumdarstellung machst Du den Pfad 'I/O ATMEGA16' auf
  und dort wiederum oeffnest du 'PORTA' und 'PORTB'.

  So jetzt laesst Du DDRA = ...  ausfuehren und sofort siehst
  Du, dass sich im simulierten ATMega16 was getan hat.

  Ein paar F10 spaeter, stehst du mitten in der Schleife, in der
  der PortB nach PortA kopiert wird.

  Klicke mal mit der Maus in eines der Qudrate neben PINB und
  mach ein paar F10. Du muesstest sehen, wie der Inhalt von PINB
  nach PortA kopiert wird. (PIN ist die Bezeichnung wenn du von
  einem Port lesen willst und der Port auf Eingang geschaltet
  ist. PORT ist die Bezeichnung wenn man auf einen Port schreiben
  will und der Port als Ausgang geschaltet ist).

Schritt 7:
  Die Simulation sieht soweit gut aus. Beende sie mit
  'Debug / Stop Debugging'
  und brenn das Programm mal in den echten Chip.
  Wie das konkret geht, haengt von deinem Brenner ab ich
  denke aber das AVR-Studio mit dem STK-500 gut zurecht
  kommen sollte. Unter 'Tools / AVR-Prog' muesste sich
  eigentlich die Brennsoftware verstecken.

Schritt 8:
  Konfiguriere die Hardware so wie es das Prgramm haben moechte:
  die LEDS kommen an den PORTA, die Taster an den PORTB

Schritt 9:
  Lass den echten ATMega16 mal das Programm ausfuehren.
  Druecke auf ein paar Taster und erfreu dich an den Lichtspielen

Schritt 10:
  Geh in die naechste Buchhandlung und kauf Dir Literatur zum
  Thema 'C-Programmierung'

HTH

von Roy T. (rl-b00n)


Lesenswert?

Ich habe das Programm schonmal im Simulator getestet und es
funktioniert, ich versteh jedoch die Schleife nicht weil die ja
garkeine bedingung hat: solange a==b .... Und dann das mit dem PullUp
Widerstand, muss der jedesmal so Programmiert werden wenn ich ne LED
ansprechen will? Und Dieses Programm ist das jetzt für eine LED? Dann
brauch ich für die zweite LED mit dem zweiten Taster ja nur das gleiche
zumachen??

von thkais (Gast)


Lesenswert?

PORTA = LEDs, PORTB = Taster. Die Pullups haben nichts mit den LEDs zu
tun, sondern mit den Tastern. Warum man Pullups bei Tastern verwendet,
findest Du mit Hilfe der Forensuche (wie auch die Lösung auf so
ziemlich alle Probleme).
Die Schleife ist eine Endlosschleife. Sonst würde das Programm genau
einmal durchlaufen und fertig.
Meine Empfehlung:
Mach Dich erst einmal mit den minimalsten elektronischen Grundlagen
bekannt (was ist ein Stromkreis) und dann schaust Du erstmal nach, was
ein Bit, ein Byte und ein Port ist. Nicht böse gemeint, aber wenn Du
mit den Port-Definitionen aus dem GCC nichts anfangen kannst, fehlen
Dir das Grundlagenwissen.

von karl-heinz (Gast)


Lesenswert?

DDRA = 0b11111111;  ??
seit wann gehen binäre-werte in winavr-c

von johnny.m (Gast)


Lesenswert?

Seit wann das geht, weiß ich nicht. Aber es geht schon ne ganze Weile!
Und nicht nur in WINAVR!

von Karl H. (kbuchegg)


Lesenswert?

> weil die ja garkeine bedingung hat

Doch, die hat eine Bedingung

  while( 1 )

Die Bedingung lautet: 1
Laut C Konvention ist alles was 0 ist logisch falsch (false)
und alles was ungleich 0 ist logisch wahr (true). Auch
ein Vergleich ist nichts anderes als ein Ausdruck, der
ein Ergebnis liefert: a == b  hat ein Ergebnis. Es ist
entweder 0, wenn a ungleich b ist oder 1 wenn sie gleich
sind. Eine logische Bedingung muss also nicht unbedingt
etwas sein, in dem ein Vergleich vorkommt. Jeder beliebige
Ausdruck, der 0 oder nicht 0 liefert ist gueltig.
1 ist ein arithmetischer Ausdruck und sein Wert ist 1, also
nicht 0 und damit logisch wahr.

d.h. obige Bedingung ist immer wahr und die Schleife
läuft endlos. Genau das wollen wir auch, wie wollen
dass die Schleife immer und immer wieder wiederholt wird.
Ein Schleifendurchlauf dauert vielleicht ein paar Mikrosekunden
und du glaubst doch nicht im Ernst, dass du in der Lage bist
genau in der richtigen Mikrosekunde den Taster zu druecken.
Also lassen wir den Rechner die Umkopieraktion immer wieder
und immer wieder machen.

von karl-heinz (Gast)


Lesenswert?

"Seit wann das geht, weiß ich nicht. Aber es geht schon ne ganze
Weile!"


für winavr-c ist das keine binäre anweisung sondern eine zahl:
11.111.111 = elfmillion-einhundertelftausend-einhundertelf.


he....he....

von karl-heinz (Gast)


Lesenswert?

ihr solltet euch mal intensiver mit winavr-c beschäftigen...

von Karl H. (kbuchegg)


Lesenswert?

@karl-heinz

der Praefix 0b ist zwar kein Standard-C Preaefix, den
gibt es allerdings in AVR-gcc schon eine ganze Weile.

Vielleicht solltest Du dich mal etwas naeher damit
beschaeftigen.

von Elektrikser (Gast)


Lesenswert?

Für den Thread-opener:
Kleine Beispiel-Programme:
http://homepage.hispeed.ch/peterfleury/avr-software.html#examples
Sind für Winavr, ohne AVR-Studio.

Gruß Elektrikser

von Roy T. (rl-b00n)


Lesenswert?

Es wir euch jetzt sicher ärgern aber in der Schule hat man mir heute
empfohlen in Assembler zu programmieren da ich das fürs nächste Jahr
brauche also war das C Programm jetzt Quasi umsonst. Das einziege was
ich jetzt brauche ist eine Einführung in Assembler wei bei C weiss ich
wenigstens wie mein ein if (){} aufbaut aber von Assembler hab ich
garkeine Ahnung. Was schlagt ihr mir vor (welches Buch oder Tutorial)?

von vorbeigeschlendert (Gast)


Lesenswert?

>...
>Es wir euch jetzt sicher ärgern aber in der Schule hat man mir
>heute empfohlen in Assembler zu programmieren
>...

Nur mal so aus Interesse... was für eine Schule empfiehlt das?

Grüße

von Karl H. (kbuchegg)


Lesenswert?

> Was schlagt ihr mir vor

Dann fang einfach mal mit dem Tutorial
auf dieser Site an.

von Roy T. (rl-b00n)


Lesenswert?

Das techniche Gymnasium... Sie sagen nicht dass Assembler besser ist
aber da ich nächstes Jahr ein Projekt machen muss für die Schule, (Ein
Roboter der per uC gesteuert wird)das in Assembler programmiert werden
muss, sagn die Lehrer sei es fR mich Vorteilhafter wenn ich mit meinem
ATmega32 in Assembler rum spiele weil ich dann schon weiss wies geht.
Ich selbst komm besser mit C klar, aber wenn ich für die Schule
Assembler brauch dann ist es wohl rasam damit zu arbeiten...

von Roy T. (rl-b00n)


Lesenswert?

>Dann fang einfach mal mit dem Tutorial
>auf dieser Site an.

Welches Tutorial meinst du? Ich kann nur die AVR-Assembler
Vergleichstabelle finden... Aber niergens die Struktur von einem
Programm. Und wie ich die PORTS Anspreche usw...

von Fritz G. (fritzg)


Lesenswert?

Die Spalte links, wo steht "AVR-GCC-Tutorial"

von Karl H. (kbuchegg)


Lesenswert?

> Welches Tutorial meinst du?

Ganz links. 2-ter Link von oben:  AVR-Tutorial

von hans dieter (Gast)


Lesenswert?

1. bei uns an der uni haben wir auch assemler-programmiert (war ein
8086), wenn man überhaupt keinen plan davon hat, wie die maschine
intern arbeitet, dann sollte man die programmierung generell (auch in
hochsprache) lassen.
2. assembler ist nicht schwer, besonders, wenn man einen c-compiler
hat, der list-files ausspuckt. dann kann man die optimierung
abschalten, schreibt das programm in c und schaut sich die mnemonics
an. nach einer weile hat man dann verstanden, wie man zahlen addiert,
funktionen aufruft usw. besonders, da bei cross-compilern immer die
selben code-abschnitte kommen, d.h. eine while-schleife sieht immer
(bis auf die bedingung) gleich aus.

von Roy T. (rl-b00n)


Lesenswert?

@ hans dieter:
Ich will ja eben nicht mit solchen "Tricks" (C-Compiler) arbeiten um
an den Assembler Code zu kommen. Ich versuche lieber gleich NUR in
Assembler zu programmieren um dann fit zu sein wenns los geht weil es
soll ende dieses Schul Jahres schon losgehen mit Midicom...

von Karl H. (kbuchegg)


Lesenswert?

Um Source Code Studium anderer wirst Du nicht
rumkommen. Ob Du jetzt den Assembler Code eines
C-Kompilers analysierst oder den Assembler-Code
von Hannes spielt wahrlich keine grosse Rolle.

Du sollst den Kompiler ja auch nicht benutzen
um zu 'tricksen'. Du sollst den Kompiler benutzen
um zu studieren wie ein Profi diverse Dinge in
Assembler programmiert.

von Roy T. (rl-b00n)


Lesenswert?

Gibts keine Liste mit den AVR Assembler Befehlen wo bei steht was die
bewirken weil hier hab ich nur ne Liste gefunden wo drin steht welcher
uC welche Befehle annimmt aber nicht was die jeweiligen Befehle
bewirken... Dann wollte ich fragen ob die LED's und Taster gleich
angesprochen werden wie bei C also mit:

  DDRA = 0b11111111;   /* die LED an Port A      */

  DDRB  = 0b00000000;  /* die Taster an Port B   */
  PORTB = 0b11111111;  /* die Pullupwiderstaende einschalten */

von Roy T. (rl-b00n)


Lesenswert?

@ Karl Heinz Buchegger

Das Problem ist ja dass ich momentan in keiner Sprache wirklich richtig
uC programmieren kann. Und bevor ich jetzt C lerne (was wesentlich
einfacher ist als Assembler), um danach den Assembler code des
Compilers zu analysieren, werde ich lieber gleich Assembler lernen weil
das dann enorm Zeit spart...

von Karl H. (kbuchegg)


Lesenswert?

Natuerlich gibt es solche Listen. Rate mal wo
man solche Befehlsreferenzen kriegt. Richtig!
Beim Hersteller der Prozessoren! http://www.atmel.com

Im uebrigen hilft Dir so eine Befehlsreferenz nicht
viel. Das ist wie beim Schachspiel. Nur weil ich
weiss welche Figuren es gibt und wie sie ziehen koennen,
kann ich noch lange nicht Schachspielen. Genauso
in der Programmierung: Die einzelnen Befehle sind
meist trivial. Es ist die Kombination von mehreren
Befehlen die das Geheimnis ausmacht.
Und das kannst Du am besten lernen, indem Du anderen
Code studierst.

Zu Deiner konkreten Frage: Warum um alles in der Welt
wehrst Du Dich so dagegen endlich einen Blick ins
Tutorial zu werfen und dort ganz einfach mal mit
lesen und lernen anzufangen?

von Rahul (Gast)


Lesenswert?

doch, das Ding nennt sich "Instruction Set Summery" und ist bei Atmel
(wo auch sonst?) zu finden.
In ASM geht das mit "in" und "out" oder so (ich programmiere in
C...).
Welche Schule zwingt einen bitte nur in Assembler zu programmieren?
(nichts gegen Assembler!).
Liegt wohl daran, dass die Lehrer die Aufgabenlösung in Asm vorliegen
haben...
Übrigens schadet es nie, von beidem Ahnung zu haben...

[OT]
Das, was ich sonst noch schreiben wollte, spare ich mir lieber, weil es
ziemlich persönlich geworden wäre.
[/OT]

von Roy T. (rl-b00n)


Lesenswert?

Das Problem mit den meisten Tutrials ist dass sie ungenau sind. Wenn man
wie ich keine Ahung davon hat braucht man was wie sowas:

In: PORTB1   <-- Setzen des Eingangs
Out: PORTB2  <-- Setzen des Ausgangs

If (PORTB1 == 1){ PORTB2 == 1 }  <-- Wenn Taster an PORTB1 gedrückt
dann LED an PORTB2 an.

So würde ich es in C probieren (dass dies nicht funktioniert weiss ich
selbst), aber das ist nunmal das einzige was ich mir momentan unter all
dem vorstellen kann...

Nur mit einem solchen Tutorial kann man lernen und verstehen wie es
funktioniert...

von Roy T. (rl-b00n)


Lesenswert?

Noch mal ganz kurz
1. Wie kan ich mit AVR Studio4, wenn ich in C was geschrieben habe, den
Assembler Code ansehen??
2. Wie kann ich hier in diesem Forum mein pw ändern?

von Hannes L. (hannes)


Lesenswert?

Du suchst die Liste der AVR-Assembler-Befehle?

Die steht in komprimierter Form (druckbar!) Am Ende der
AVR-Datenblätter. Gleich daneben gibt es die Liste der I/O-Adressen,
meist mit Seitenangabe, wo das jeweilige Register erklärt wird.

Wenn du dann konkretere Hilfe zu den ASM-Befehlen möchtest, dann nutze
die Online-Hilfe des AVR-Studio. Tippe den gewünschten Befehl ins
Editorfenster, setze den Cursor drauf und drücke die F1-Taste. Geht
leider nicht bei Direktiven, die kannst du aber über das Help-Menü
"erhangeln".

Du brauchst wirklich nix weiter außer AVR-Studio, Datenblätter,
AVR-Appnotes und etwas Geduld.

...

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.