Forum: Mikrocontroller und Digitale Elektronik C Progamm funktioniert nicht


von Dursun G. (dursun)


Lesenswert?

Hallo ,
ich bin in den Anfängen brauche die einfachsten Ünterstüzungen.
Mein Problem:
Ich lade aus dem Programm Myavr "LED on" und brenne in das 
Microcontroller ATmega8 in C. Es funktioniert nicht.
Hier das Programm:
//----------------------------------------------------------------------
// Titel       : myAVR Beispiel "LED an" für den ATmega8/48/88/168
//----------------------------------------------------------------------
// Funktion    : Schaltet alle 3 LEDs an
// Schaltung   : PortB.0-2 an LEDs
//----------------------------------------------------------------------
// Prozessor   :
// Takt       : 3.6864 MHz
// Sprache     : C
// Datum       : 02.12.2005
// Version     : 1.3
// Autor       : Dipl. Ing. Päd. Alexander Huwaldt
// Programmer  : ...
// Port      : ...
//----------------------------------------------------------------------
#define   F_CPU 3686400  // Taktfrequenz des myAVR-Boards
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
main ()
{
  DDRB=0xFF;       //PortB auf Ausgang konfigurieren
  do
  {
    PORTB=0xFF;   // PortB High, LEDs on
  }
  while (true);    // Mainloop
}
//----------------------------------------------------------------------

In Assembler funktioniert das ganze einwandfrei.

Danke Dursun

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

Blöde frage:

compilierst du es auch?

Wenn ja kannst du doch einfach mal den ASM code vergleichen.

von Dursun (Gast)


Lesenswert?

Ja ich compiliere.
Was sind ASM  code und vergleich man sie?
Danke Dursun

von ElTio (Gast)


Lesenswert?

Ich wusste gar nicht, dass ein "true" gibt... :-/

von Peter K. (peterka2000)


Lesenswert?

ElTio schrieb:
> Ich wusste gar nicht, dass ein "true" gibt... :-/

Ich auch nicht. Versuchs mal mit 0 anstatt true.

von ElTio (Gast)


Lesenswert?

Oder besser mit 1... ;-)

von Cyblord -. (cyblord)


Lesenswert?

Das Programm macht doch keinen Sinn. Da werden doch nur die Ports High 
gesetzt, warum wird das in einer Schleife dauernd ausgeführt?

Dann das "true" ist wirklich komisch. Ersetze durch "1".

Wie testest du obs funktioniert? Was erwartest du?

gruß cyblord

von Peter K. (peterka2000)


Lesenswert?

Auserdem eventuel anstatt main()
1
...
2
int main(void){
3
...
4
}
5
...

von ElTio (Gast)


Lesenswert?

In dem Fall aber "return 0;" nicht vergessen.

von Peter K. (peterka2000)


Lesenswert?

Jetzt ist mein C Wissen am Ende, aber wie wärs mit
1
while(1){
2
3
}
anstatt
1
while(1);
2
}
Bin ich mir nicht sicher, könnte aber sein.

von Cyblord -. (cyblord)


Lesenswert?

Peter K. schrieb:
> Auserdem eventuel anstatt main()
>
1
> ...
2
> int main(void){
3
> ...
4
> }
5
> ...
6
>

Quatsch.

Aber sagt mal, wenn das Programm copy&paste ist, programmiert man dann 
so als Dipl. Ing. ? duck und weg

von ElTio (Gast)


Lesenswert?

1
main ()
2
{
3
   
4
   DDRB=0xFF;       //PortB auf Ausgang konfigurieren
5
   PORTB=0xFF;   // PortB High, LEDs on
6
  
7
   while (1){
8
   }
9
}

von ElTio (Gast)


Lesenswert?

lol... Was mache ich denn da? Meine Bauch ist voll und mein Kopf müde.. 
ich lass es lieber! ;-)

von Peter K. (peterka2000)


Lesenswert?

cyblord ---- schrieb:
> Peter K. schrieb:
>> Auserdem eventuel anstatt main()
>>
1
>> ...
2
>> int main(void){
3
>> ...
4
>> }
5
>> ...
6
>>
>
> Quatsch.
>
> Aber sagt mal, wenn das Programm copy&paste ist, programmiert man dann
> so als Dipl. Ing. ? *duck und weg*

Kein Quatsch, ich habe einen bekannten von Atmel und der hat mir das so 
beigebracht.

von Dursun G. (dursun)


Lesenswert?

ich möche erstmal nur die Ausänge von PortB auf Ausgang konfigurieren
   und die  LEDs on und mehr nicht.
Ich habe alle Vorschläge umgesetzt.Leider funktioniert nicht.
Danke dursun
.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was heißt "funktioniert nicht"?

Und wie genau sieht Deine Schaltung aus?

Wie genau sieht Dein Sourcecode jetzt aus?

von Peter K. (peterka2000)


Lesenswert?

Nochmal gesamt:
1
#include <avr/io.h
2
3
int main(void){
4
   DDRB = 0xFF;
5
   PORTB = 0xFF;
6
   while(1){
7
8
   }
9
   return 1; //Wird nie erreicht
10
}

von Dursun G. (dursun)


Lesenswert?

Eine Frage: Liegt villeicht an den Einstellungen? Nur so ...

von Peter K. (peterka2000)


Lesenswert?

Kann sein.
Aber 1. Mit welchen Programm codest du?
2. Benutzt du das MyAVRProgTool -> Dann richtiges Board mit µC 
eingestellt??

von Dursun G. (dursun)


Lesenswert?

Die Schaltung ist orginal von ATmega8-Board und der aktuelle Sourcecode:
#include <avr/io.h

int main(void){
   DDRB = 0xFF;
   PORTB = 0xFF;
   while(1){

   }
   return 1; //Wird nie erreicht
}

von ElTio (Gast)


Lesenswert?

Ich fände es hilfreich wenn du einmal gesammelt deine Informationen 
postest:
- kompletter Quellcode
- Toolchain
- Einstellungen der Tools

von Yagan Ζ. D. (yagan)


Lesenswert?

// Funktion    : Schaltet alle 3 LEDs an
// Schaltung   : PortB.0-2 an LEDs

Macht es das nicht?
Das Programm sollte funktionieren, wenn die Hardware dazu passt.
Ciao, Yagan

von Cyblord -. (cyblord)


Lesenswert?

Peter K. schrieb:
> Nochmal gesamt:
>
>
1
> #include <avr/io.h
2
> 
3
> int main(void){
4
>    DDRB = 0xFF;
5
>    PORTB = 0xFF;
6
>    while(1){
7
> 
8
>    }
9
>    return 1; //Wird nie erreicht
10
> }
11
>

Ja man sieht schon du bist der Checker. Ans Ende gehört ein return 0, 
das signalisiert ein Beenden ohne Fehler. Auch wenn das nie erreicht 
wird. return 1 wäre ein Fehler.

gruß cyblord

von Christian H. (christian_h)


Lesenswert?

Warum ignorierst du alle Lösungsvorschläge und gehst weiter auf dein 
Programm ein? Das funktioniert nicht, das ist halt falsch und wieso, 
wurde hier bereits erwähnt. (true ist zum Beispiel ist dort nirgends 
definiert). Probiere doch mal die anderen vorgeschlagenen Programme und 
schau dir C-Tutorials an.

von Karl H. (kbuchegg)


Lesenswert?

> Ans Ende gehört ein return 0,
> das signalisiert ein Beenden ohne Fehler. Auch wenn das nie erreicht
> wird. return 1 wäre ein Fehler.

Ja, ok.
Das ist jetzt aber erst mal nicht mehr relevant.
Wird dieses Pgm für einen Mega8 compiliert, gelinkt und aufs Board 
gebrannt, müssen die Pins am PORTB alle auf 1 gehen.

von Cyblord -. (cyblord)


Lesenswert?

Trotzdem wäre ein Blink-Programm fürs testen besser. Wenn die LED nach 
VCC geschaltet ist, sieht er nix. Ein Blinken wäre eindeutig.

von Dursun G. (dursun)


Lesenswert?

Das myAVR Workpad mit Board light.
Wo kann ich schauen ob es richtig eingestellt?

von Peter K. (peterka2000)


Lesenswert?

cyblord ---- schrieb:
> Ja man sieht schon du bist der Checker. Ans Ende gehört ein return 0,
> das signalisiert ein Beenden ohne Fehler. Auch wenn das nie erreicht
> wird. return 1 wäre ein Fehler.
>
> gruß cyblord

Aha, gruess mal meinen Bekannten von Atmel - das ist ein 
Originalquelltext von ihm.

von Cyblord -. (cyblord)


Lesenswert?

Peter K. schrieb:
> cyblord ---- schrieb:
>> Ja man sieht schon du bist der Checker. Ans Ende gehört ein return 0,
>> das signalisiert ein Beenden ohne Fehler. Auch wenn das nie erreicht
>> wird. return 1 wäre ein Fehler.
>>
>> gruß cyblord
>
> Aha, gruess mal meinen Bekannten von Atmel - das ist ein
> Originalquelltext von ihm.

Falsch bleibt falsch. Und wenn es der Papst geschrieben hätte.

von Peter K. (peterka2000)


Lesenswert?

HAst du schon mal mit einem Multimeter am ATMega gemessen? Villeicht 
gibt es probleme mit den LEDs.

von Peter K. (peterka2000)


Lesenswert?

cyblord ---- schrieb:
> Peter K. schrieb:
>> cyblord ---- schrieb:
>>> Ja man sieht schon du bist der Checker. Ans Ende gehört ein return 0,
>>> das signalisiert ein Beenden ohne Fehler. Auch wenn das nie erreicht
>>> wird. return 1 wäre ein Fehler.
>>>
>>> gruß cyblord
>>
>> Aha, gruess mal meinen Bekannten von Atmel - das ist ein
>> Originalquelltext von ihm.
>
> Falsch bleibt falsch. Und wenn es der Papst geschrieben hätte.

Ist jetzt auch egal.

von Dursun G. (dursun)


Lesenswert?

nochmal ich habe alle Vorschläge 1:1 übernommen und compiliert auf dem 
Board.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

cyblord ---- schrieb:
> Ja man sieht schon du bist der Checker. Ans Ende gehört ein return 0,
> das signalisiert ein Beenden ohne Fehler. Auch wenn das nie erreicht
> wird. return 1 wäre ein Fehler.

Das ist hier vollkommen irrelevant. Und der Laufzeitumgebung auf dem AVR 
ist das auch noch vollkommen wurscht.

Interessant ist die Schaltung, d.h. wie die LEDs mit den Portleitungen 
von PortB verbunden sind.

von Peter K. (peterka2000)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

cyblord ---- schrieb:
> Trotzdem wäre ein Blink-Programm fürs testen besser. Wenn die LED nach
> VCC geschaltet ist, sieht er nix. Ein Blinken wäre eindeutig.

Dann soll ers so machen.
1
#include <avr/io.h
2
3
int main(void){
4
   DDRB = 0xFF;
5
   PORTB = 0x55;
6
   while(1){
7
   }
8
}

Anstelle von 0x55 kann man auch 0xAA benutzen. Damit brennt auf jeden 
Fall jede 2.te LED (wenn man mal die naheliegende Annahme treffen kann, 
dass alle LEDs gleich verschaltet sind)

von Cyblord -. (cyblord)


Lesenswert?

Das Problem wird auch nicht am Programm liegen. Entweder das Kompilieren 
klappt nicht, oder das brennen oder die Verschaltung stimmt nicht. Dazu 
kommen noch die Fuses. Wer weiß das schon. Alles sehr wirr und vom TE 
kommt auch nix sinnvolles.

von Dursun G. (dursun)


Lesenswert?

Das Orginalprogramm von Atmel in Assembler funktionert einwandfrei.
Die LED's sind auch einwandfrei.
Das Orginal-und Vorgeschlagenenrprogramme funktionieren in C nicht.

von Cyblord -. (cyblord)


Lesenswert?

Dursun Göyünc schrieb:
> Das Orginalprogramm von Atmel in Assembler funktionert einwandfrei.
> Die LED's sind auch einwandfrei.
> Das Orginal-und Vorgeschlagenenrprogramme funktionieren in C nicht.

Wird denn wirklich ohne Fehler kompiliert? Brennst du die korrekte HEX 
Datei? Geht das Brennen ohne Fehler?

von Yagan Ζ. D. (yagan)


Lesenswert?

Dursun Göyünc schrieb:
> Das Orginalprogramm von Atmel in Assembler funktionert einwandfrei.

Welche Ports werden denn im Assemblerprogramm benutzt?
Sind es vielleicht andere als im C-Programm?

von Dursun G. (dursun)


Lesenswert?

so sieht jetzt das Programm aus:

//----------------------------------------------------------------------
// Titel       : myAVR Beispiel "LED an" für den ATmega8/48/88/168
//----------------------------------------------------------------------
// Funktion    : Schaltet alle 3 LEDs an
// Schaltung   : PortB.0-2 an LEDs
//----------------------------------------------------------------------
// Prozessor   :
// Takt       : 3.6864 MHz
// Sprache     : C
// Datum       : 02.12.2005
// Version     : 1.3
// Autor       : Dipl. Ing. Päd. Alexander Huwaldt
// Programmer  : ...
// Port      : ...
//----------------------------------------------------------------------
#define   F_CPU 3686400  // Taktfrequenz des myAVR-Boards
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
#include <avr/io.h

int main(void)
{
   DDRB = 0xFF;
   PORTB = 0x55;
   while(1){

   }
}

von Dursun G. (dursun)


Lesenswert?

hier das Programm in Assembler:

;----------------------------------------------------------------------
; Titel    : myAVR Beispiel "LED an" für den ATmega8
;----------------------------------------------------------------------
; Funktion    : eine LED wir angeschalten
; Schaltung    : PORTB.0=LED1
;----------------------------------------------------------------------
; Prozessor    : ATmega8
; Takt    : 3,6864 MHz
; Sprache    : Assembler
; Datum    : 09.11.2007
; Version    : 1.0
; Autor    : Stephan Hänsel
; Programmer  :
; Port    :
;----------------------------------------------------------------------
.equ  F_CPU,  3686400
.include  "AVR.H"
;----------------------------------------------------------------------- 
-
;Reset and Interruptvectoren  ;VNr.  Beschreibung
begin:
  rjmp  main  ; 1    POWER ON RESET
  reti    ; 2    Int0-Interrupt
  reti    ; 3    Int1-Interrupt
  reti    ; 4    TC2 Compare Match
  reti    ; 5    TC2 Overflow
  reti    ; 6    TC1 Capture
  reti    ; 7    TC1 Compare Match A
  reti    ; 8    TC1 Compare Match B
  reti    ; 9    TC1 Overflow
  reti    ;10    TC0 Overflow
  reti    ;11    SPI, STC Serial Transfer Complete
  reti    ;12    UART Rx Complete
  reti    ;13    UART Data Register Empty
  reti    ;14    UART Tx Complete
  reti    ;15    ADC Conversion Complete
  reti    ;16    EEPROM Ready
  reti    ;17    Analog Comperator
  reti    ;18    TWI (I²C) Serial Interface
  reti    ;19    Strore Program Memory Ready
;----------------------------------------------------------------------- 
-
;Start, Power ON, Reset
main:
  ldi  r16,lo8(RAMEND)
  out  ioSPL,r16
  ldi  r16,hi8(RAMEND)
  out  ioSPH,r16  ;init Stack
  sbi  ioDDRB,0
;----------------------------------------------------------------------- 
-
mainloop:
  wdr
  ldi  r16,0b00000001  ;LED ON
  out  ioPORTB,r16
  rjmp  mainloop
;----------------------------------------------------------------------- 
-

von Otto (Gast)


Lesenswert?

im Assemblerprogramm wird aber nur eine LED eingeschaltet.....

> ; Funktion    : eine LED wir angeschalten

ist klar....

von Hurga (Gast)


Lesenswert?

cyblord ---- schrieb:
> Falsch bleibt falsch. Und wenn es der Papst geschrieben hätte.

Seit wann kann ein Sozi kodieren?
Dann schon lieber der Kumpel von Atmel :-9

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.