Forum: Mikrocontroller und Digitale Elektronik ATTiny24A AVR Simulator ändert die Ports nicht wie im Quelltext geschrieben!?


von kai (Gast)


Lesenswert?

Hi.
Folgender Code:
1
#define F_CPU 128000UL  // 128 kHz
2
3
#include <avr/io.h>
4
#include <stdlib.h>
5
#include <avr/delay.h>
6
#include <avr/eeprom.h>
7
8
int main(void)
9
{
10
  //______________Initialisierung_____________________
11
  DDRA |= 0xFF;
12
  DDRB |= (1<<PINB0) | (1<<PINB1) | (1<<PINB2);
13
...

Das AVR Studio 5 ist auf Attiny24A eingestellt. Ich gehe den Code im AVR 
Simulator zeilenweise durch und schaue mir die Bits in DDRA und DDRB an. 
Aber bei DDRA |= 0xFF; und DDRB |= (1<<PINB0) | (1<<PINB1) | (1<<PINB2); 
ändert sich nichts. Auch wenn ich PORTA und PORTB schreibe, werden im 
Simulator keine Bits gesetzt....

Hab ich was falsch programmiert? Oder liegt es am Simulator? Würde der 
Code später auf meinem realen Chip laufen?

Grüße.
von Bernd (Gast)


Lesenswert?

Kann mich mit dem Studio 5 nicht anfreunden und
arbeite bei µCs auch nicht mit C.

Probier doch mal die Initialisierung
nicht mit " |= ", sondern mit der simplen
Zuweisung " = ".

Sehr sinnvoll scheint mir das "ver-ODERn" von
Porteinstellungen nicht:

Entweder haben die für das ganze "Programmleben"
nur eine Aufgabe: Dann mit " = " zuweisen.

Oder ich will was ändern, dann bekomme ich mit "ODER"
aber keine vorher gesetzte "EINS" wieder auf "NULL"...
von Lehrmann M. (ubimbo)


Lesenswert?

Bernd schrieb:
> und
> arbeite bei µCs auch nicht mit C.

So womit dann? Und sag bitte jetzt nicht Basic oder einem Basicdialekt.

Bernd schrieb:
> Probier doch mal die Initialisierung
Ich sehe aber keine Initialisierung im engeren Sinne - das sind 
Zuweisungen, auch wenn dies die erste Zuweisung im dargestellten Code 
sind.


Bernd schrieb:
> Sehr sinnvoll scheint mir das "ver-ODERn" von
> Porteinstellungen nicht:

Willst du uns hier verarschen? Diese Aussage muss man sich mal auf der 
Zunge zergehen lassen. Im hier gegebenen Beispiel sicherlich 
gleichwertig aber für alle anderen Fälle bin ich sprachlos.

Bernd schrieb:
> Oder ich will was ändern, dann bekomme ich mit "ODER"
> aber keine vorher gesetzte "EINS" wieder auf "NULL"...

Ich empfehle dir dich mit Grundlagen Bitmanipulation auseinanderzusetzen 
und dann wieder an dieser Diskussion Teil zu nehmen. Aber zu 
postulieren, dass OR-Verknüpfungen sinnlos sind deutet darauf hin, dass 
du nicht im entferntesten Verständnis von digitalen System, Hintergründe 
in Mikrocontrollerwissen oder Deresgleichen hast.

Zum Thema:

kai schrieb:
> DDRA |= 0xFF;

Das wandelt der Compiler sowieso sinngemäß in der Optimierung zu DDRA = 
0xFF um.

kai schrieb:
> DDRB |= (1<<PINB0) | (1<<PINB1) | (1<<PINB2);

Setzt mal zur Sicherheit Klammern

DDRB |= ((1<<PINB0) | (1<<PINB1) | (1<<PINB2));

es sollte eigentlich keinen Unterschied machen, da |= (Operatorpriorität 
2') gegenüber | (Operatorpriorität 6) vorrang haben sollte - 
vorrausgesetzt es ist ein ANSI-C-Compiler.

Ansonsten:

+ hast du eine Endlosschleife ?
+ wie geht dein Code weiter ?
von kai (Gast)


Lesenswert?

Also mit Klammern ist es auch nicht besser.
Nach dem Codebeispiel kommt ne Endlosschleife also einfach:
1
 while(1)
2
    {
3
}
4
return 0;
5
}
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

kai schrieb:

> Hab ich was falsch programmiert? Oder liegt es am Simulator?

Schau mal den erzeugte Assembler- oder Object-Code an. Dass siehst du 
zumindest mal of der Code richtig ist oder der Simulator spinnt oder die 
Generierungsumgebung, die bei Quelländerung nicht neu compiliert.
von Ernst B. (puravida)


Lesenswert?

Hi!

Also ich habe das gerade im AVR-Studio 5 probiert, auch mit dem 
Attiny24A und Deinem Code
1
#define F_CPU 128000UL  // 128 kHz
2
3
#include <avr/io.h>
4
#include <stdlib.h>
5
#include <avr/delay.h>
6
#include <avr/eeprom.h>
7
8
int main(void)
9
{
10
  
11
    //______________Initialisierung_____________________
12
  DDRA |= 0xFF;
13
  DDRB |= (1<<PINB0) | (1<<PINB1) | (1<<PINB2);
14
  
15
    while(1)
16
    {
17
        //TODO:: Please write your application code 
18
    }
19
}

Und die Ports reagieren beide beim debuggen. Liegt also entweder an 
irgendwelchen Einstellungen oder an der Installation.

LG
Ernst
von Matthias (Gast)


Lesenswert?

kai schrieb:
> Hab ich was falsch programmiert? Oder liegt es am Simulator? Würde der
> Code später auf meinem realen Chip laufen?

Da meint der Compiler, dass die Zeile DDRB |= ... überflüssig ist und 
optimiert die weg. Wenn du die Optimierung ausschaltest oder 
irgendwelchen sinnvollen Code dahinter schreibst (z.B. DDRB = 0x00; ), 
wird die Zeile auch in ausführbaren Code umgesetzt.
von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:
> kai schrieb:
>> Hab ich was falsch programmiert? Oder liegt es am Simulator? Würde der
>> Code später auf meinem realen Chip laufen?
>
> Da meint der Compiler, dass die Zeile DDRB |= ... überflüssig ist und
> optimiert die weg.

Wenn er das tut, dann wäre das ein schwerer Fehler im Compiler.

Was aber sein kann: Er hat die Optimierung eingeschaltet und der 
Debugger findet die Assembler-Entsprechung der Anweisung im C Code nicht 
mehr.
von Matthias (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was aber sein kann: Er hat die Optimierung eingeschaltet und der
> Debugger findet die Assembler-Entsprechung der Anweisung im C Code nicht
> mehr.

Da scheinst du Recht zu haben. Zumindest mit AVR Studio 4 wird der 
Binärcode richtig erzeugt, aber der Simulator zeigt es das Ergebnis 
nicht richtig an.
1
000000ce <main>:
2
  ce:  8a b3         in   r24,  0x1a  ;  26
3
  d0:  8f ef         ldi  r24,  0xFF  ; 255
4
  d2:  8a bb         out  0x1a,  r24  ;  26
5
  d4:  87 b3         in   r24,  0x17  ;  23
6
  d6:  87 60         ori  r24,  0x07  ;   7
7
  d8:  87 bb         out  0x17,  r24  ;  23
8
  da:  ff cf         rjmp  .-2        ; 0xda <main+0xc>
von Ernst B. (puravida)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Matthias schrieb:
>> kai schrieb:
>>> Hab ich was falsch programmiert? Oder liegt es am Simulator? Würde der
>>> Code später auf meinem realen Chip laufen?
>>
>> Da meint der Compiler, dass die Zeile DDRB |= ... überflüssig ist und
>> optimiert die weg.
>
> Wenn er das tut, dann wäre das ein schwerer Fehler im Compiler.
>
> Was aber sein kann: Er hat die Optimierung eingeschaltet und der
> Debugger findet die Assembler-Entsprechung der Anweisung im C Code nicht
> mehr.

Das könnte der schlagende Hinweis sein. Mein funktionierender Test war 
ohne Optimierung. Bei -oS rennt der Debugger ins nirgendwo bei der Zeile 
DDRB |= ... Die erste Zeile funktioniert noch.
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Welches Debug-Format wird denn verwendet?
STABS? DWARF2? DWARF3? DWARF4?
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.