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


von Huhn (Gast)


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

von Justus S. (jussa)


Lesenswert?

vielleicht solltest du in der C-Version auch PORTB setzen...

von Huhn (Gast)


Lesenswert?

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

von TestX .. (xaos)


Lesenswert?

DDRx setzt nur die datenrichtung
PORTx den pegel..

von Georg W. (gewe)


Lesenswert?

Es fehlt in C der entsprechende Programmteil zu
1
         ldi r16, 0b00001100
2
         out PORTB, r16

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

von Huhn (Gast)


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

von Huhn (Gast)


Lesenswert?

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

von Huhn (Gast)


Lesenswert?

Geht nicht :( LED ist aus Das ist irgendwie echt komisch :(

von Huhn (Gast)


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

von Gast (Gast)


Lesenswert?

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

von Huhn (Gast)


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

von Huhn (Gast)


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.

von Justus S. (jussa)


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

von Otto (Gast)


Lesenswert?

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

Otto

von Huhn (Gast)


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?

von Justus S. (jussa)


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

von Huhn (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

1
#include <avr/io.h>
2
unsigned int i,t
3
int main(void)
4
{
5
  DDRB=0xFF;
6
  while(1)
7
  {
8
      PORTB=0xff;
9
      for(i=0,i=65000;i++)
10
      PORTB=0x00;
11
      for(i=0,i=65000;i++)
12
  }
13
}

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

von Georg W. (gewe)


Lesenswert?

Tom schrieb:

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

Glaub ich bei der for-Schleife eher nicht.

von Huhn (Gast)


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.

von Karl H. (kbuchegg)


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!

von Robert K. (molch) Benutzerseite


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

von Karl H. (kbuchegg)


Lesenswert?

Der korrigierte Code von Tom muss so aussehen
1
#include <avr/io.h>
2
3
volatile unsigned int i;
4
5
int main( void )
6
{
7
  DDRB = 0xFF;
8
9
  while( 1 )
10
  {
11
      PORTB = 0xff;
12
      for( i = 0; i < 65000; i++ )
13
        ;
14
15
      PORTB = 0x00;
16
      for( i = 0; i < 65000; i++ )
17
        ;
18
  }
19
}

von Georg W. (gewe)


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?
1
#include <util/delay.h>
2
...
3
_delay_ms(500);
4
...

cu
Georg

von Karl H. (kbuchegg)


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

von Huhn (Gast)


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

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.