-
Probleme Fusebits
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
-
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/
-
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
-
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.
-
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
-
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)
Code:
while(1) PINB = 0x01; //alternativ (1<<PB0) oder einfach dezimal 1
-
Sowas ähnliches gibts z.B. bei den C166V2.
Bei den AVRs in C tuts da aber eher PORTB ^= (1 << Pinnr)