ATmega2560 - LED blinkt nicht

Gast #5712866
Lesenswert?

Guten Abend,

ich versuche gerade ein einfache Blinky Programm zum Laufen zu bekommen.
1
#define F_CPU 1600000UL
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
int main (void) {
7

8
   DDRB |= (1 << PB7);
9

10
   while(1) {
11
       PORTB ^= (1 << PB7);
12
       _delay_ms(500);
13
   }
14

15
   return 0;
16
}

Die Zeile in der while mit |= oder &= ~ zu ersetzen hat auch nichts 
verändert (die LED leuchtet einfach durchgängig). Wenn ich aber das 
Standard-Blinky-Projekt aus der Arduino IDE nehme und diese hex flashe, 
dann läuft es auch.

1
>>  make
2
avr-g++ -mmcu=atmega128 -I. -gstabs   -Os -pedantic -Wall -Wextra -std=c++14  main.cpp   --output main.elf     -lm
3
avr-objcopy -O ihex -R .eeprom main.elf main.hex
4
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
5
--change-section-lma .eeprom=0 -O ihex main.elf main.eep
6
avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 never used
7

8
>> avrdude -c avrisp2 -P usb -p m2560 -U flash:w:main.hex
9

10
avrdude: AVR device initialized and ready to accept instructions
11

12
Reading | ################################################## | 100% 0.00s
13

14
avrdude: Device signature = 0x1e9801 (probably m2560)
15
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
16
         To disable this feature, specify the -D option.
17
avrdude: erasing chip
18
avrdude: reading input file "main.hex"
19
avrdude: input file main.hex auto detected as Intel Hex
20
avrdude: writing flash (196 bytes):
21

22
Writing | ################################################## | 100% 0.06s
23

24
avrdude: 196 bytes of flash written
25
avrdude: verifying flash memory against main.hex:
26
avrdude: load data flash data from input file main.hex:
27
avrdude: input file main.hex auto detected as Intel Hex
28
avrdude: input file main.hex contains 196 bytes
29
avrdude: reading on-chip flash data:
30

31
Reading | ################################################## | 100% 0.07s
32

33
avrdude: verifying ...
34
avrdude: 196 bytes of flash verified
35

36
avrdude: safemode: Fuses OK (E:FD, H:D8, L:FF)
37

38
avrdude done.  Thank you.

Also wenn ich die hex mit einer durch Arduino compilerten austausche, 
dann blinkt die LED.

Sieht jemand den Fehler?

Beste Grüße.
#5712900
Lesenswert?

LarsBeuth schrieb:
> #define F_CPU 1600000UL
>
> #include <avr/io.h>
> #include <util/delay.h>
>
> int main (void) {
>
>    DDRB |= (1 << PB7);
>
>    while(1) {
>        PORTB ^= (1 << PB7);
>        _delay_ms(500);
>    }
>
>    return 0;
> }

Warum sollte das blinekn?
Du schaltest innerhalb der while-schleife die LED in einen Zustand aber 
niemals in den Anderen.
1
#define F_CPU 1600000UL
2
 
3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
int main (void) {
7

8
   DDRB |= (1 << PB7);
9

10
   while(1) {
11
       PORTB ^= (1 << PB7);
12
       _delay_ms(500);
13
       PORTB |= (1 << PB7);
14
       _delay_ms(500);
15
   }
16

17
   return 0;
18
}

so wirds dann auch blinken.
#5712927
Lesenswert?

Könnte sein, dass die delay routine die Probleme macht.

Versuch doch mal mit einer eigenen Delay routine. (reine software 
delay). Ich weiss nicht, ob das delay() aus der Kompiler lib auf timern 
beruht.

Mit sowas sollte man ein delay hinbekommen, was nicht wegoptimiert wird
delay()
{
  volatile int i,k;
  for(i=0;i<irgendwas;i++)
  {
    for (k=0;k<irgenwas2;k++);
  }
}
Gast #5712940
Lesenswert?

Interessante Antworten!

Ich fasse mal zusammen:

LarsBeuth schrieb:
> ich versuche gerade ein einfache Blinky Programm zum Laufen zu bekommen.
Das Programm ist völlig ok, und funktioniert auch.
Lasse dir in der Hinsicht keinen erzählen.

Dieses ist faul:
> avr-g++ -mmcu=atmega128


> PORTB ^= (1 << PB7);
Alternativ:
> PINB = (1 << PB7);
Diese Mikrooptimierung macht den Braten aber auch nicht viel fetter.
Gast #5712943
Lesenswert?

Muss man mit einem ATmega2560 seine ersten BLINK-Übungen machen?

Viele schaffen das nicht mal mit einem Tiny25, konnten ihre
Datenblatt-Leseschwäche aber viel einfacher und billiger auf
einem Steckbrett erkennen.

Upps, falsches Hobby???  ;-)
Gast #5712963
Lesenswert?

Harry L. schrieb:
>>        PORTB ^= (1 << PB7);

> Warum sollte das blinekn?
> Du schaltest innerhalb der while-schleife die LED in einen Zustand aber
> niemals in den Anderen.

Quatsch. XOR schaltet Bit 7 korrekt zwischen 0 und 1.

Ob die LED an diesem Pin hängt, ist eine andere Sache, aber umgeschaltet 
wird das Bit. Du solltest keine Tipps geben, die falsch sind.
Beitrag #5712969 wurde von einem Moderator gelöscht.
Gast #5712970
Lesenswert?

Karl M. schrieb:
> Martin B. Komma
>
> Ich habe doch schon die Lösung genannt, es wurde das Projekt für einen
> falschen AVR übersetzt.

Ach? main in loop geändert, läuft die Schleife sogar auf einem Arduino. 
Was
nun?

Kann es sein, dass eine kleine, verschworene Truppe absichtlich Desinfo 
platziert? Kann das sein ? ........ ^^
Beitrag #5712976 wurde von einem Moderator gelöscht.
Beitrag #5712989 wurde von einem Moderator gelöscht.
Gast #5712990
Lesenswert?

Jedi Knight schrieb:
> Ach? main in loop geändert, läuft die Schleife sogar auf einem Arduino.
> Was
> nun?

Gar nicht nötig...
Nur die Zeile
> #define F_CPU 1600000UL
auskommentieren.
Dann kompiliert es ohne Warnung mit der Arduino IDE.
loop() und setup() sind nicht nötig.
Aber dann gehen millis() und Konsorten nicht mehr.
Beitrag #5712994 wurde von einem Moderator gelöscht.
Gast #5713062
Lesenswert?

Danke für eure Hilfe!

Nach dem ändern des Makefiles für die richtige Zielplattform und dem 
ändern der F_CPU (ich habe eine Null zuwenig drinn gehabt - wie schon 
gesagt wurde) hat es geklappt.

Danke nochmals!
Gast #5713088
Lesenswert?

Ach ja, gibt es auch die Möglichkeit den AVR über das USB Kabel zu 
programmieren? Halt so wie es die Arduino IDE auch macht nur ohne 
Arduino.

Nur ein USB Kabel zu brauchen und den mk2-Programmer in der Tasche zu 
lassen wäre schon lässig.
#5713158
Lesenswert?

... davon ausgehend, dass du einen Arduino Mega2560 hast:

avrdude -c wiring -p atmega2560 -P SerialPort -b115200 -D -v 
-Uflash:w:meinhexfile.hex:i

Für SerialPort den Port angeben an dem das Teil angeschlossen ist:

Bsp. für Windows

-P com5

Bsp. für Linux

-P /dev/ttyACM0

für Clone mit CH340 Chip

-P /dev/ttyASB0

Hinweis:

Ohne das Flag -D (Auto-Erase) funktioniert das ganze leider nicht !!!
Beitrag #5713287 wurde von einem Moderator gelöscht.
Beitrag #5713299 wurde von einem Moderator gelöscht.
(Firma: matzetronics) #5713301
Lesenswert?

Man muss dazu sagen, das die Toggle Funktionalität per Schreiben ins 
PINx Register bei alten MCs wie dem Mega8 oder sonstigen Urgesteinen 
(AT90S2313 oder so, igitt) noch nicht vorhanden war.
Das ist allerdings kein Grund, auf das Nichtlesen des aktuellen 
Datenblattes des Mega2560 zu bestehen, wo eindeutig steht:
13.2.2 Toggling the Pin
Writing a logic one to PINxn toggles the value of PORTxn, independent on 
the value of DDRxn. Note that the SBI instruction can be used to toggle 
one single bit in a port.
Diese Funktionalität gibt es bei allen modernen AVR.
Beitrag #5713321 wurde von einem Moderator gelöscht.
Beitrag #5713501 wurde von einem Moderator gelöscht.
Gast #5713576
Lesenswert?

Bisher scheinst du da einige Blockaden vor dir her zu schieben....

Offensichtlich hast du folgende (Pin Toggle) Zeile noch nicht 
verstanden:
> PINB = (1 << PB7);
Denn sonst würdest du etwas demütiger agieren.

Auch mit dieser Aussage scheinst du Probleme zu haben:
> Dann kompiliert es ohne Warnung mit der Arduino IDE.
> loop() und setup() sind nicht nötig.
Denn sonst würdest du etwas demütiger agieren.

Jetzt wäre für dich ein guter Augenblick gekommen, dich kundig zu 
machen, dann den Rückwärtsgang einzulegen, und zuzugeben wie derbe du 
daneben liegst.


Marcus Tullius Cicero:
> Jeder Mensch kann irren, aber Dummköpfe verharren im Irrtum!


Es kann natürlich sein, dass du derartige Dingen nicht verstehst, oder 
überprüfen kannst, weil dir die Hirnkapazität fehlt. Alles möglich.
Aber ist das dann deine Rechtfertigung für solche geistigen Flatulenzia?

Klar stört dich deine eigene Unfähigkeit!
Bedenke aber dabei: Der Bote ist nicht die Wurzel des Übel.
Beitrag #5713608 wurde von einem Moderator gelöscht.
Beitrag #5713626 wurde von einem Moderator gelöscht.
Beitrag #5713632 wurde von einem Moderator gelöscht.
Beitrag #5713634 wurde von einem Moderator gelöscht.
Beitrag #5713639 wurde von einem Moderator gelöscht.
Beitrag #5713644 wurde von einem Moderator gelöscht.
#5713654
Lesenswert?

Seine LED leuchtet nicht schrieb im Beitrag #5713634:
> Das ist keine Bösartigkeit, sondern der Verzweiflung geschuldet. Ich
> finde, das sollte man wissen, um Uli besser zu verstehen. Gute
> Besserung, Uli, toy toy toy. Du schaffst das

Beweist ihm doch erstmal das Gegenteil auf sachlicher und technischer 
Ebene, als sich hier so tief runterzulassen.
Beitrag #5713665 wurde von einem Moderator gelöscht.
Beitrag #5713669 wurde von einem Moderator gelöscht.
Beitrag #5713675 wurde von einem Moderator gelöscht.
Beitrag #5713676 wurde von einem Moderator gelöscht.
Beitrag #5713680 wurde von einem Moderator gelöscht.
Beitrag #5713682 wurde von einem Moderator gelöscht.
Beitrag #5713683 wurde von einem Moderator gelöscht.
Beitrag #5713685 wurde von einem Moderator gelöscht.
Beitrag #5713686 wurde von einem Moderator gelöscht.
Beitrag #5713699 wurde von einem Moderator gelöscht.
Beitrag #5713707 wurde von einem Moderator gelöscht.
Beitrag #5713719 wurde von einem Moderator gelöscht.
Beitrag #5713959 wurde von einem Moderator gelöscht.
Beitrag #5713967 wurde von einem Moderator gelöscht.
Beitrag #5713970 wurde von einem Moderator gelöscht.
Beitrag #5713982 wurde von einem Moderator gelöscht.
Beitrag #5713988 wurde von einem Moderator gelöscht.
Beitrag #5713997 wurde von einem Moderator gelöscht.
Beitrag #5714003 wurde von einem Moderator gelöscht.
Beitrag #5714009 wurde von einem Moderator gelöscht.
Beitrag #5714010 wurde von einem Moderator gelöscht.
Beitrag #5714025 wurde von einem Moderator gelöscht.
Beitrag #5714034 wurde von einem Moderator gelöscht.
Beitrag #5714035 wurde von einem Moderator gelöscht.
Beitrag #5714037 wurde von einem Moderator gelöscht.
Beitrag #5714045 wurde von einem Moderator gelöscht.
Beitrag #5714046 wurde von einem Moderator gelöscht.
Beitrag #5714055 wurde von einem Moderator gelöscht.
Beitrag #5714059 wurde von einem Moderator gelöscht.
Beitrag #5714062 wurde von einem Moderator gelöscht.
Beitrag #5714066 wurde von einem Moderator gelöscht.
Gast #5714069
Lesenswert?

Thomas G. schrieb:
> würde unsigned int UI auch
> funktionieren.

int ist der default Datentype für Konstanten.
Ein einfaches U reicht für unsigned int

Bei UI ist das I schon für andere Zwecke reserviert.
Gcc: _complex_


Vielleicht nicht schön, aber gültig:
1
unsigned test = 4711U;
Gast #5714082
Lesenswert?

Thomas G. schrieb:
> Also eine positive (unsigned) 64-Bit (long) Zahl.

Nein!

Long ist nur als "mindestens 32bit" spezifiziert, meisten sind es 
tatsächlich 32bit. Für 64bit musst du "unsigned long long" bzw "ULL" 
schreiben.

> würde unsigned int UI auch funktionieren?
Bei arm-gcc ja, bei avr-gcc nein.

Siehe Spec: https://de.wikipedia.org/wiki/Datentypen_in_C
Für arm-gcc: 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/Babfcgfc.html
Für avr-gcc: 
https://de.wikibooks.org/wiki/C-Programmierung_mit_AVR-GCC/_Datentypen

Gerade bei F_CPU habe ich bisher aber immer nur einfach die Zahl als 
Literal hingeschrieben, ohne solche Buchstaben suffixe.
Gast #5714085
Lesenswert?

Jawoll!
Hier ist ein ATMega2560 Thread, also U 16Bit, UL 32 Bit und ULL 64Bit
Für andere µC/CPU gibt die Compiler Doku gerne Auskunft.

Stefanus F. schrieb:
> Gerade bei F_CPU habe ich bisher aber immer nur einfach die Zahl als
> Literal hingeschrieben, ohne solche Buchstaben suffixe.
Mag in vielen Fällen gut gehen.
Aber bei UL hat der Compiler die Chance, dir eine Warnung um die Ohren 
zu hauen.
1
unsigned int  testA = 47115645654; // geht ohne Warnung durch
2
unsigned int  testB = 47115645654ULL; // gibt Geschrei
Beitrag #5714097 wurde von einem Moderator gelöscht.
Gast #5714123
Lesenswert?

Joachim B. schrieb:
> so eine Krümellei, was soll es denn sonst sein?

long long int sieht jedenfalls doof aus, viel schöner wäre longilong.
1
#define longilong long long int
2
#define ulongilong unsigned long long int
3
#define years *364*24*60*60*1000;
4

5
longilong time=now() + 100 years;

A lala lala long ....
Beitrag #5714151 wurde von einem Moderator gelöscht.
Beitrag #5714183 wurde von einem Moderator gelöscht.
Beitrag #5714194 wurde von einem Moderator gelöscht.
Beitrag #5714226 wurde von einem Moderator gelöscht.
Beitrag #5714289 wurde von einem Moderator gelöscht.
Beitrag #5714654 wurde von einem Moderator gelöscht.
Beitrag #5715065 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren