Ausgang toggeln

Gast #4397820
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
}
Gast #4397828
> #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?
#4397836
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 ...
#4397844
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.
Gast #4397855
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 :-)
#4397860
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
Gast #4397872
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?
Gast #4397955
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
#4397975
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?
#4398051
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.
#4398083
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.
Gast #4398098
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
};

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.