www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 problem mit programmierung in C


Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich lese schon einige eit im Forum mit ,und hab mir jetzt mein 
eigenes Board gebaut. Es besteht aus einem ATmga32 ein paar LED´s, 
Taster 7-Segment Anzeige...
Jetzt wollt ich nachdem ich alles gelötet habe mal ne LED ansteuern, hab 
mir die C Tutorials durchgelesen, und habs kompiliert und programmiert. 
Es ging auch alles, also bim proggen kein Fehler und als ich getestet 
hab hat nichts geleuchtet, außer die LED für die Spannungsversorgung 
(bei mir ne Grüne LED, die ON / OFF signalisiert).

Hab etwas geshcut, und hab zufällig nen Assembler code gefunden wo ne 
LED ansteuert. Kopiert, geändert, geflasht und hat auf anhieb 
funktioniert!
Ich war sehr ras, da es an der Hardware nicht liegen kann, also hab an 
den Fusebits NIX verstell, wollt einfach ma was proggen.

Hier noch meine Scripts vllt könnt ihr mir helfen, bin ratlos und find 
nix zu dem Prob. im Net:

C:

#include <avr/io.h>
int main() {
  while(1) {
     DDRB=0xFF;
  }
  return 0; }


Assembler:

.include "m32def.inc"
         ldi r16, 0xFF
         out DDRB, r16
         ldi r16, 0b00001100
         out PORTB, r16
ende:    rjmp ende

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht solltest du in der C-Version auch PORTB setzen...

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie meinste Port B setzen? ich hab mir tuts durchgelesen, wo das so 
ähnlich aufgebaut war

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRx setzt nur die datenrichtung
PORTx den pegel..

Autor: Georg W. (gewe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlt in C der entsprechende Programmteil zu
         ldi r16, 0b00001100
         out PORTB, r16

Der könnte evtl. so oder so ähnlich aussehen:
#include <avr/io.h>
int main(void)
{
  DDRB=0xFF;
  while(1)
  {
      PORTB=0b0001100;
  }
}

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie muss dann der korrekte Code lauten? ich hab jetzt schon zwei Tage 
nur damit verbracht danch zu suchen ;) wär super wenn ihr mir das ma 
erklären könntet, weiß auch nicht wo das stehen muss also in oder 
außerhalb der loop

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och mann hätet ihr nicht noch 20 sekunden warten können ;) mann!

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht nicht :( LED ist aus Das ist irgendwie echt komisch :(

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir den Keiner Helfen? Würd gen ma was für mein Board proggen und 
das in C ;( die Tuts helen mir nicht, weil die nicht gehen bei mir 
zumindest in C nich, in Assembler gehen sie ja

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn der Assembler Code aus, den der Compiler aus deinem 
C-Schnipsel macht?

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinste? ich hab den Assembler code im I-Net gefunden, habs 
geflasht, und es hat funktioniert, und den C-Code hab ich auch gefunden 
geflasht, ging nicht obohl in dem tut stand, das es gehen müsste, 
richtig angeschlossen ist die LED also immer an Masse und der port muss 
dann 5V geben, vorwid. ist direkt am Port die Scripts stehen oben also 
im ersten Beitrag

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also das Programm kann ich gut Übertragen und es Funktioniert, hab auch 
shcon ma ne HEX aus dem Forum geflasht, die machte auch was sie sollte, 
auch an PORTB aber warum kann ich meine LES nicht ansteuern, bei der Hex 
blinktedie erste LED immer aber ich will ja ne LED auf PB2 und PB3 zum 
leuten bringen.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhn schrieb:
> ich hab den Assembler code im I-Net gefunden, habs
> geflasht, und es hat funktioniert, und den C-Code hab ich auch gefunden
> geflasht

und wie sieht der Assembler-Code von dem C-Code aus? das wollte Gast 
wissen...

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hoffe, dass Du das C-Programm zuerst compiliert hast und dann das 
".hex" geflasht hast - oder ?

Otto

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das mit dem Assembler Code vom C hap ich immern och nich gerafft, 
natürlich hab ich die Hex geflasht, F7 gedrückt, alles okay, keine 
Warnings hex ausgewählt, übertragen fertig.

Das mit den zwei Codes weis ich nicht, oder kann man einen C code in 
Assembler umwandeln?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhn schrieb:

> Das mit den zwei Codes weis ich nicht, oder kann man einen C code in
> Assembler umwandeln?

vielleicht solltest du dich mal informieren, was dein Compiler 
macht...und du könntest dir mal die Dateien anschauen, die dein Compiler 
erstellt

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab den AVR Studio 4 und wollt grad gucken wo ich den Assembler code 
generieren kann, ich finds aber net

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
unsigned int i,t
int main(void)
{
  DDRB=0xFF;
  while(1)
  {
      PORTB=0xff;
      for(i=0,i=65000;i++)
      PORTB=0x00;
      for(i=0,i=65000;i++)
  }
}


Versuch mal diesen Code.
Hier müssten die LED's blinken.
Als erstes solltest Du es mal im Simularor testen wird dort der Pin dann 
als richtig signalisiert sollte das gleiche auch auf Deinem Board 
funktionieren oder hast Du schon an den Fuse herumgespielt ?!?!?!?.
Obwohl dann wäre auch eine übertragung des Programms nicht möglich.Hmmm.
Richtiges programm an den Uc geschickt?
Versorgungsspannung OK?
Reset Pin richtig beschaltet?
An alle Pin's Vcc und GND angeschlossen die vorgeschrieben sind?
Hat schon mal was funktioniert auf den Board oder ist es der erste 
Versuch dann könnte auch der Fehler am Board selber liegen Berdrahtung 
Polung LED etc.

Am meisten ist es so das das Problem nicht der uC etc. ist sondern der 
der davor sitzt.
Sorry ist nicht böse gemeint ist aber fast immer so.

Tom

Autor: Georg W. (gewe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:

>
> ...
>       for(i=0,i=65000;i++)
> ...
> 
>
> Versuch mal diesen Code.
> Hier müssten die LED's blinken.

Glaub ich bei der for-Schleife eher nicht.

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
../ATmega_Board.c:5: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'int'
make: *** [ATmega_Board.o] Error 1


Das ist das ergebis ein eror,jas hat schon ma ne HEX funktioniert, da 
sollten sie auch blinken, find die aber nicht mher, hab das aber dann 
nachgemessen, und die Spannung schwankte dann immer also -> Blinken! 
aber der Code geht nich.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhn schrieb:
> ../ATmega_Board.c:5: error: expected '=', ',', ';', 'asm' or
> '__attribute__' before 'int'
> make: *** [ATmega_Board.o] Error 1

Grundsätzlich

Wenn dir ein Code Fehler gibt, dann zeig den Code!
Selbst dann wenn dir wer den Code hier im Forum gibt.

unsigned int i,t

Da fehlt ein Strichpunkt

unsigned int i,t;


for(i=0,i=65000;i++)

Da ist ein Komma fehl am Platze, und die Abbruchbedingung ist eine 
Zuweisung und kein Vergleich

for(i = 0; i == 65000; i++ )

(Genau aus dem Grund mach ich gerne Leerzeichen vor Operatoren. Da sieht 
man sowas nämlich besser.

Huch, in dem Code ist ja noch jede Menge anderes Zeugs falsch!

Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Huhn,

in der oben angegeben for-Schleife ist wie schon richtig angemerkt nen 
Fehler. Da man gerade so einen leicht übersieht und sich gern tot sucht 
->
for (i = 0; i == 65000; i++) {};
Also statt dem Komma nach dem i=0 ein ;

Such mal in deinem Projektverzeichnis nach einer Datei mit der Endung 
.lss !
Die öffnest du und kopierst uns den Inhalt hier ins Forum ;)
Das ist der Assemblercode den der Compiler aus deinem C-Code generiert.

MfG
Molch

edit:
Danke @ KH, bei mir war auch noch nen Fehler drin.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der korrigierte Code von Tom muss so aussehen
#include <avr/io.h>

volatile unsigned int i;

int main( void )
{
  DDRB = 0xFF;

  while( 1 )
  {
      PORTB = 0xff;
      for( i = 0; i < 65000; i++ )
        ;

      PORTB = 0x00;
      for( i = 0; i < 65000; i++ )
        ;
  }
}

Autor: Georg W. (gewe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:

1. dumme Anfängerfrage:

Warum "volatile"? Hier wird doch nicht mit ISR's gearbeitet.

2. dumme Anfängerfrage:

Bringt uint16_t statt unsigned int zur besseren Lesbarkeit und 
Klarstellung, dass man einen 16bit Wert haben will etwas?


Würde sich als Alternative zu den Schleifen nicht auch folgendes 
anbieten?
#include <util/delay.h>
...
_delay_ms(500);
...

cu
Georg

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Georg Werner schrieb:
> @Karl Heinz:
>
> 1. dumme Anfängerfrage:
>
> Warum "volatile"? Hier wird doch nicht mit ISR's gearbeitet.

mit ISR nicht.
Aber rate mal, was ein Optimizer mit

      for( i = 0; i < 65000; i++ )
        ;

machen wird :-)

Wenn ich den Compiler aber zwinge, jeden Zugriff auf i, den ich 
programmiere, auch tatsächlich im Code zu belassen, kann er die Schleife 
nicht wegoptimieren.

>
> 2. dumme Anfängerfrage:
>
> Bringt uint16_t statt unsigned int zur besseren Lesbarkeit und
> Klarstellung, dass man einen 16bit Wert haben will etwas?

Bei unsigned int ist erst mal nicht klar, wieviele Bits das tatsächlich 
sind. Der Compiler sucht sich eine Bitbreite, die ihm (und der CPU 
genehm ist). Auf PC's ist ein unsigned int heutzutage 32 Bit breit. Und 
die Erweiterung auf 64 Bit steht schon in den Startlöchern.

Ein uint16_t hingegen ist immer 16 Bit breit. Egal auf welcher CPU

> Würde sich als Alternative zu den Schleifen nicht auch folgendes
> anbieten?

Klar. Wäre auch die bessere Lösung.
Aber der TO hat auch so schon genug zu kämpfen :-)

Autor: Huhn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community!
Ihr habt mir den oben genannten Code gegeben, mit vielen Fehlern, aus 
meiner guten C++ Erfahrung hab ich mal etwas gesucht nachdem ich mehrere 
Fehler hatte. Als ich dann soweit war, und alles lief fiel mir die 
Schleife auf, ich hatte hier im Forum mal gelesen, dass es nicht gerade 
geschickt ist eine verzögerung mit for aufzurufen, hab jetzt was mit 
delay gemacht, und alles funktioniert, die LED leutet, bzw sie blinkt 
jetzt sehr Hektisch, und ich kann endlich mein Testboard weitermachen. 
Ich hab mir ein Testboard auf eine gesammte Lochrasterplatine gemacht 
und diese so ziemlich perfekt ausgefüllt, also hab fast keinen platz 
mehr.

Ich meld mich dann mal wieder, wenn ich was wissen will.

Danke an alle die mir es ermöglicht haben diese Platine zu proggen!!


DANKE

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.