Forum: Mikrocontroller und Digitale Elektronik Ausgang toggeln


von Stefanie (Gast)


Lesenswert?

Hallo Forum,

Ich will den Port B meines AT Mega32 toggeln lassen.
Leider funktioniert dies nicht.
Kann mir jemand sagen ob der Code richtig ist?
Nicht dass mein Programmer ein Fehler hat

vielen Dank
1
#define F_CPU 16000000UL       //Taktfrequenz 1MHz
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main(void){
7
    DDRB |= (1 << PB0);       // damit ist dann PB0 ein Ausgang
8
9
    while(1){
10
        PORTB = 0b11111111;  //PB0 im PORTB setzen
11
        _delay_ms(1000);       //1000ms warten
12
13
        PORTB = 0b00000000; //PB0 im PORTB löschen
14
        _delay_ms(1000);       //1000ms warten
15
    }
16
17
    return 0;
18
}

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> #define F_CPU 16000000UL       //Taktfrequenz 1MHz
Hat es vielleicht mit dieser Diskrepanz zu tun, bzw. mit welchem Takt 
läuft der Controller wirklich und was ist an PB0 zu sehen?

von Stefan S. (sschultewolter)


Lesenswert?

1
    while(1){
2
        PORTB = 0b11111111;  //PB0 im PORTB setzen
3
        _delay_ms(1000);       //1000ms warten
4
5
        PORTB = 0b00000000; //PB0 im PORTB löschen
6
        _delay_ms(1000);       //1000ms warten
7
    }

Mag zwar gehen, ist aber unschön, da du hier jeweils das ganze 
Portregister änderst.

Besser
1
    while(1){
2
        PORTB |= (1<<0);  //PB0 im PORTB setzen
3
        _delay_ms(1000);       //1000ms warten
4
5
        PORTB &= ~(1<<0); //PB0 im PORTB löschen
6
        _delay_ms(1000);       //1000ms warten
7
    }

oder
1
    while(1){
2
        PORTB ^= (1<<0);  //PB0 im PORTB togglen
3
        _delay_ms(1000);       //1000ms warten
4
}
oder ...

von Karl H. (kbuchegg)


Lesenswert?

Spielt aber alles keine Rolle, wenn der µC nicht wie in F_CPU angegeben 
mit 16Mhz läuft sondern nur mit 1MHz, wie es im Kommentar steht.

Nein. Der Mega läuft nicht automatisch mit 16Mhz, nur weil du bei F_CPU 
das so  hinschreibst. F_CPU ist die Information für den Compiler aber 
was du da hinschreibst interessiert den eigentlich IC nicht die Bohne. 
Der läuft so schnell, wie er eben eingestellt ist.
Allerdings führt eine Falschangabe bei F_CPU dann dazu, dass die Zeiten 
bei _delay_ms nicht stimmen. Wenn dein Mega also tatsächlich noch immer 
mit 1Mhz läuft, du deinen Compiler aber mit den 16Mhz angelogen hast, 
dannn dauern die _delay_ms jetzt alls 16 mal so lange. D.h deine LED 
blinkt nicht im Sekundentakt, sondern nur alle 16 Sekunden. Und das ist 
eine lange Zeit, bei der man schon mal die Geduld verlieren kann und 
'funktioniert nicht' diagnostiziert.

von S. Landolt (Gast)


Lesenswert?

Und während einer Tasse Kaffee staunt man, dass doch noch etwas 
passiert.

von Stefanie (Gast)


Lesenswert?

Ja, der Controller läuft definitiv mit 16Mhz, da war der Kommentar 
falsch.
Auch die 16 Sekunden warten sind somit hinfällig.
vielleicht dcch einfach mal abwarten und Kaffee trinken.
Ich wollte nur auf Nummer sicher gehen, damit ich mich nicht vermesse, 
deshalb habe ich alle Pinss toggeln lassen.

aber das Programm scheint ja richtig zu sein.

vielleicht nochmals ein Käffchen trinken :-)

von Paul B. (paul_baumann)


Lesenswert?

Karl H. schrieb:
> Der Mega läuft nicht automatisch mit 16Mhz, nur weil du bei F_CPU
> das so  hinschreibst.

Es wäre nicht schlecht, wenn man die Fuse-Bits, wie in BASCOM möglich, 
mit dem $PROG-Kommando im Quelltext einstellen könnte.

Ja, ich weiß: hier geht es um "C". Aber man sieht manchmal Sachen, die 
in anderen Sprachen (und Entwicklungsoberflächen) schöner sind.

mfG Paul

von S. Landolt (Gast)


Lesenswert?

Kann es bei den heutigen IDEs noch vorkommen, dass das nicht für einen 
ATmega32 übersetzt wurde?

> der Controller läuft definitiv mit 16 MHz
Also Quarz oder externer Takt und die Low-fuse entsprechend eingestellt?

von S. Landolt (Gast)


Lesenswert?

Betriebsspannung über 4.5 V (am Controller gemessen)?
Falls 16 MHz-Quarz, ist CKOPT in der High-fuse gesetzt?

von Stefanie (Gast)


Lesenswert?

Ja die Betriebsspannung ist bei 4,5V
Ich glaube das Problem liegt wo ganz wo anders.
Ich benutze den AVR MK2 Programmer, den steuere ich unter Ubuntu an.
für das vorherige Projekt hatte ich die richtige .elf Datei. Bei neuen 
Projekt natürlich nicht mehr.
Kann mir jemand sagen wie ich diese unter Ubuntu anpassen kann?


vielen Dank im voraus

von Karl H. (kbuchegg)


Lesenswert?

Stefanie schrieb:
> Ja die Betriebsspannung ist bei 4,5V
> Ich glaube das Problem liegt wo ganz wo anders.
> Ich benutze den AVR MK2 Programmer, den steuere ich unter Ubuntu an.
> für das vorherige Projekt hatte ich die richtige .elf Datei.

Die interessiert nicht.
Letzten Endes kommt aus dem ganzen Compilierprozess eine HEX-Datei raus. 
Und die wird gebrannt.

> Bei neuen
> Projekt natürlich nicht mehr.
> Kann mir jemand sagen wie ich diese unter Ubuntu anpassen kann?

Kopfkratz.
Du hast doch irgendein Brennprogramm. Und dem kannst du angeben, wie die 
HEX-Datei heisst, die du brennen willst und auf welchem Verzeichnis sie 
ist.
Wo also liegt das Problem?

von Stefanie (Gast)


Lesenswert?

d.h. ich benötige gar keine .elf Datei?
Ich programmiere unter Eclipse und Ubuntu

von Axel S. (a-za-z0-9)


Lesenswert?

Stefanie schrieb:
> d.h. ich benötige gar keine .elf Datei?
> Ich programmiere unter Eclipse und Ubuntu

Autsch. Bitte, lern die Grundlagen. Sonst wird das nichts.
Hier gehts los: AVR-GCC-Tutorial

@Karl Heinz:

Speziell unter Linux wird sehr wahrscheinlich avrdude verwendet.
Und der kann seit einigen Releases das .elf Binary direkt flashen.
Die Extraktion des Flash-Segments und Umwandlung nach Intel HEX
ist nicht mehr zwingend notwendig.

von Karl H. (kbuchegg)


Lesenswert?

Axel S. schrieb:

> Speziell unter Linux wird sehr wahrscheinlich avrdude verwendet.
> Und der kann seit einigen Releases das .elf Binary direkt flashen.

Ah. Danke. Das wusste ich nicht.
Hatte mich insgeheim ohnehin schon gewundert, warum das Brennprogramm 
anscheinend die ELF Datei akzeptiert und keinen Fehler meldet. Jetzt ist 
klar warum.

Bleibt aber immer noch die Frage, warum sie dann nicht weiss welche 
Datei sie flasht und ob das die richtige ist.

: Bearbeitet durch User
von asd (Gast)


Lesenswert?

Paul B. schrieb:
> Es wäre nicht schlecht, wenn man die Fuse-Bits, wie in BASCOM möglich,
> mit dem $PROG-Kommando im Quelltext einstellen könnte.
>
> Ja, ich weiß: hier geht es um "C". Aber man sieht manchmal Sachen, die
> in anderen Sprachen (und Entwicklungsoberflächen) schöner sind.

Auch beim GCC kann man die Fuses in den Quelltext schreiben.

z.B. so:
1
FUSES = 
2
{
3
    .low = (FUSE_CKSEL0 & FUSE_CKSEL1 & FUSE_CKSEL3 & FUSE_SUT0 & USE_CKDIV8),
4
    .high = HFUSE_DEFAULT,
5
    .extended = EFUSE_DEFAULT,
6
};

von asd (Gast)


Lesenswert?

...das geht auch mit den Lockbits:
1
LOCKBITS = (LB_MODE_3);

von Max D. (max_d)


Lesenswert?

Also bei Eclipse mit Plugin und avrdude erzeugt ja normalerweise das 
plugin selber den richtigen aufruf für "den dude".
Wie hast du das denn konfiguriert ?

von Paul B. (paul_baumann)


Lesenswert?

@Asd
Danke für die Auskunft.

mfG Paul

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.