Hi
ich glaub ~ vergessen.
probier mal PORTB &= ~( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B
lg
Hallo,
ich versuche mich gerade mit AVR GCC jedoch funktioniert das nicht so
einfach wie ich mir das vorgestellt habe. Im Moment habe ich folgenden
Quellcode zusammenkopiert *zugeb*. Richtiges C und C++ kann ich Programmieren, jedoch macht mir die Portlogik doch noch erhebliche
Schwierigkeiten.
Ich wollte eigentlich nur Port B4 und B5 blinken lassen.Code:#include <avr/io.h> #include <util/delay.h> int main(void){ DDRB = 0xff; PORTB = 0x04; while (1){ PORTB |= (1<<PB4) | (1<<PB5); //4 und 5 high auf B _delay_ms(5000); PORTB &= ( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B _delay_ms(5000); } return 0; }
Jedoch habe ich mit dem Digimulti immer 5V auf dem Pin.
Das Programmierboard arbeitet einwandfrei, da ich es früher für schon
mit Basic Programmiert habe.
PS gibts sowas wie PORTB1 = 1 / 0 auch ? Die "Levelshifts" finde ich nähmlich (zumindestens jetzt) noch sehr kompliziert.
Danke schon im Voraus für eure Hilfe.
Vielleicht kann mir ja jemand ein paar mini Beispiele zukommen lassn. So nach dem Motto mal Pin ein und ausschalten und abfragen würde schon für den Anfang mal reichen.
Hi
ich glaub ~ vergessen.
probier mal PORTB &= ~( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B
lg
Kann es sein, dass an der High zeile auch was nicht stimmt, denn nun ist der Pin immer auf 0V
Kommando zurück danke es funktionier nur scheint es 50 sek zu dauern und nicht wie ich dachte 5 sek.
Kann es sein, dass ich noch etwas für meine Quarz angben muss ?
Oder wie bringe ich dem AT Mega32 bei das dieser zu nutzen ist ?
das müsste gehen.
Code:#include <avr/io.h> #include <util/delay.h> int main(void){ DDRB = 0xff; PORTB = 0x04; while (1) { PORTB |= (1<<PB4) | (1<<PB5); //4 und 5 high auf B _delay_ms(5000); PORTB &= ~( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B _delay_ms(5000); } return 0; }
Datenblatt Fusebits oder im Wiki
Du musst die Fuse-Bit so setzen, dass er das Quarz anspricht. Definier noch F_CPU.
Hier mal nen Programm von mir, dass ungefähr das selbe macht.
Hab mal irgendwo gelesen, dass man die delay funktion nur bis 1000 benutzen sollte.Code:/* Testschaltung Version: 0.1 Datum: 07.01.2009 Autor: Finn 'Kani' Schürmann Target: AtMega 8515 Lizenz: Keine */ #include <avr/io.h> #include <util/delay.h> #define F_CPU 16000000UL //16MHZ int main(void) { DDRA = 0xFF; //PORTA auf Ausgang stellen PORTA = 0xFF; //Sicher gehen das zum Start alle Bits "aus" sind. DDRB = 0x00; //PORTB als Eingang zur Vorbeugung von Kurzschlüssen DDRC = 0x00; //PORTC als Eingang zur Vorbeugung von Kurzschlüssen DDRD = 0x00; //PORTD als Eingang zur Vorbeugung von Kurzschlüssen while( 1 ) { PORTA |= (1 << PA1); // Bit PA1 wird gesetzt PORTA &= ~(1 << PA0); // Bit PA0 wird gelöscht _delay_ms(1000); PORTA |= (1 << PA0); // Bit PA0 wird gesetzt PORTA &= ~(1 << PA1); // Bit PA1 wird gelöscht _delay_ms(1000); } }
mit delay_ms(5000) scheint das ganze bei 50 sek zu liegen dachte immer 1000ms = 1 sek
Hi,
Üblicherweise wird Controller und Quarztakt im Code etwa so beschrieben:Zitat von Tux12Fun
Und der Quarz muss "aktiviert" werden. Ein fabrikfrischer Controller (wenn Du den hast) läuft auf internem Quarz - und dann gibts da noch den Takt-Dividierer (CKDIVCode:#include <avr/interrupt.h> . . . . . . #define MCU = AVR_ATmega168 #define F_CPU 20000000 // Quarz 20 Mhz-CPU- aber zum Glück gibts Fuse-Calkulators *ggggg*.
Ciao sagt der JoeamBerg
Also die F_CPU
und MCP habe ich gesetzt wie oben beschrieben nur auf
AVR_ATmega32
und F_CPU auf 16000000
geändert.
Könnte mir jemand evtl noch bei den Fuse Bits helfen.
So ganz blicke ich durch den Calc nicht durch.
an meinem AT-Mega hängt ein 16 MHZ Quarz mit 2x 22pf
Schaltplan sieht so aus
AT------Quarz-----22pf----|Masse
AT------Quarz-----22pf----|Masse
Im Ponnyprog ist
Bootsz1
Bootsz0
SUT0
CKSEL3
CKSEL2
CKSEL1
aktiv
Lesezeichen