PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme Fusebits



Fr4nk
09.02.2010, 09:22
Hallo zusammen,


da ich das auf die schnelle nicht finde, frage ich lieber gleich, dazu folgender Quelltext:

/***Programmanfang***/
#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 16000000 //16MHz
#endif

int main(){

DDRB = (1<<PB0); //PB0 auf Ausgang

while(1){
PORTB |= (1<<PB0); //einschalten und
PORTB &= ~(1<<PB0); //sofort wieder ausschalten
}
return 0;

}
/***Programmende***/

Das Programm soll natürlich mit maximaler Frequenz den PORT/PIN B0 ein und ausschalten. Ich bekomme aber 800kHz.

Meine Fusebits:

CKSEL = 1111 (16MHz Quarz)
CKOPT = 0
SUT0 = 0
SPIEN = 0

der Rest auf 1

Frage 1:
Dachte die maximale Frequenzausgabe liegt bei mindestens 1/2 F_CPU also 8MHz, stimmt das?

Frage 2:
Die Fusebits sind okay?

Beste Grüße
Frank

Hubert.G
09.02.2010, 10:05
Also 20 Takte für die vier Programmzeilen halte ich schon für realistisch.
Wenn du die max. Frequenz an einem Pin benötigst, musst du dir einen Kontrolller suchen wie z.B. den Mega88 mit einem CLKO (Clockout) an PB0.

Zum Einstellen der Fuses verwende ich das hier:
http://www.engbedded.com/fusecalc/

Fr4nk
09.02.2010, 10:27
Hallo Hubert,

das ein/ausschalten eines PORTs müsste eine Periode dauern, deshalb gehe ich ja von 8MHz aus.

Laut Datenblatt ist die maximal erreichbare Frequenz mit einem Timer: 8MHz, also 1/2 F_CPU.

Die while(1) Abfrage dürfte 1,2 oder 3 Takte dauern, damit komme ich dann aber immer noch auf mehr als 800kHz. Auf dem Oszilloskop sieht das Rechteck ziemlich gleichmäßig aus(also gleiche Überschwinger, gleiches Abklingverhalten, gleiche Steilheit).

Mein Problem sind eigentlich, die Fusebiteinstellungen. Die genannte Seite kenne ich, habe mich auch danach gerichtet.

Ich meine vielleicht können die normalen PORTs das nicht, was ich aber nicht glaube.

Danke für deine Antwort.

Beste Grüße
Frank

Hubert.G
09.02.2010, 11:24
Schau dir den Code mal im Assembler an, dann wirst du sehen das die 20 Takte realistisch sind.
Der Timer läuft in Hardware, Ausgabe über den OCx. Da wäre es möglich das es geht, hab ich aber noch nie probiert.

Fr4nk
09.02.2010, 13:18
Also ich denke du hast recht, der Mega läuft so wie ichs vogesehen habe nicht bei der hohen Frequenz, aber der Quarz funktioniert.

Besten Dank

Ceos
09.02.2010, 14:21
ich weis nicht ob der controller das kann, aber ich meine man müsste über das setzen einer 1 im PIN register den PORT toggeln können! (das hab ich jetzt in einer dunklen ecke meines gedächtnis gefunden)



while(1) PINB = 0x01; //alternativ (1<<PB0) oder einfach dezimal 1

Jaecko
09.02.2010, 14:25
Sowas ähnliches gibts z.B. bei den C166V2.
Bei den AVRs in C tuts da aber eher PORTB ^= (1 << Pinnr)