PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SOLVED] Erste schritte mit AVR GCC



Tux12Fun
03.03.2009, 19:53
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.



#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;
}


Ich wollte eigentlich nur Port B4 und B5 blinken lassen.
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.

chientech
03.03.2009, 19:58
Hi

ich glaub ~ vergessen.

probier mal PORTB &= ~( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B

lg

Tux12Fun
03.03.2009, 20:14
Kann es sein, dass an der High zeile auch was nicht stimmt, denn nun ist der Pin immer auf 0V

Tux12Fun
03.03.2009, 20:19
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 ?

chientech
03.03.2009, 20:21
das müsste gehen.


#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;
}

chientech
03.03.2009, 20:26
Datenblatt Fusebits oder im Wiki

Finn91
03.03.2009, 20:27
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.

/* 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);
}
}
Hab mal irgendwo gelesen, dass man die delay funktion nur bis 1000 benutzen sollte.

Tux12Fun
03.03.2009, 20:27
mit delay_ms(5000) scheint das ganze bei 50 sek zu liegen dachte immer 1000ms = 1 sek

oberallgeier
03.03.2009, 20:34
Hi,


... Kann es sein, dass ich noch etwas für meine Quarz angben muss ? ...Üblicherweise wird Controller und Quarztakt im Code etwa so beschrieben:

#include <avr/interrupt.h>
. . . . . .
#define MCU = AVR_ATmega168
#define F_CPU 20000000 // Quarz 20 Mhz-CPU
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 (CKDIV8) - aber zum Glück gibts Fuse-Calkulators (http://www.engbedded.com/cgi-bin/fc.cgi?P_PREV=ATmega168&P=ATmega32&V_LOW=E2&V_HIGH=DF&V_EXTENDED=F9&M_LOW_0x3F=0x22&M_HIGH_0x07=0x07&M_HIGH_0x20=0x00&M_EXTENDED_0x06=0x00&B_SPIEN=P&B_SUT0=P&B_CKSEL3=P&B_CKSEL2=P&B_BOOTSZ1=P&B_BOOTSZ0=P&B_CKSEL0=P) *ggggg*.

Tux12Fun
03.03.2009, 20:52
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

sast
03.03.2009, 21:03
Schreib mal
#define F_CPU 1000000L wenn das F_CPU im Code definiert wird sonst halt mal 1MHz ins makefile
Wenn du noch nie was an den Fuses eingestellt hast, kann es sein, dass wirklich noch die Werkseinstellung drauf ist. Wirst ja sehen ob es dann schneller geht

sast

Besserwessi
03.03.2009, 21:07
Die delay Funktionen stimmen auch nur wenn die optimierung angeschaltet ist. Es sollte da in den Optionen bzw. im Makefile irgendwo eine -Os stehen (Optimierung auf Code-größe).

Finn91
03.03.2009, 21:09
Jop, es gibt auch Optimierung auf Geschwindigkeit.
Aber wenn es weniger zu lesen gibt (Code-Größe), geht es natürlich auch schneller.

McJenso
03.03.2009, 21:10
Hallo,

Fusebit_Calculator (http://www.engbedded.com/cgi-bin/fc.cgi/?P_PREV=ATmega32&P=ATmega32&V_LOW=E1&V_HIGH=99&M_LOW_0x3F=0x21&M_LOW_0x80=0x80&M_HIGH_0x06=0x00&M_HIGH_0x20=0x00&M_HIGH_0x40=0x00&B_SPIEN=P&B_SUT0=P&B_CKSEL3=P&B_CKSEL2=P&B_BOOTSZ1=P&B_CKSEL1=P&B_BOOTSZ0=P&O_BITS=Apply+fuse+bits)

Gruß

Jens

sast
03.03.2009, 21:12
zB gibts hier einen online
http://www.engbedded.com/fusecalc/

sast

Edit: eigentlich hatte ich den Link gesucht den Joe schon in seinem Post hat. Naja der ist es wert noch mal erwähnt zu werden.

oberallgeier
03.03.2009, 21:12
Ok ok ok, dann also noch die Fusebits im PonyProg - gerade ausgelesen aus meinem M32 mit 16 MHz.
Parameter:
Boot Flash size=256 words start address=$3FF0
SPIEN
Brown-out detection at VCC=4.0 V
Ext. Crystal High Frequ.; Start-up time: 1K CK + 4 ms
Sprich: Fuses low to high: 0x7E, 0xDF

DIES IST NUR (M)ein BEISPIEL

@alle - den Fuse-bit Calculator hatte ich ihm doch schon sechs Stockwerk höher genannt.

Tux12Fun
03.03.2009, 21:41
Wow super,

danke für die Mühe, mein AT-Mega tut was er soll :-) nachdem ich den 1. bereits durch fuse Bit testen geschrottet habe. Zum Glück habe ich 4 Stück bestellt.

sast
03.03.2009, 21:43
Woran lag es den nun?

Tux12Fun
03.03.2009, 21:57
es war die Fuse Einstellung mein AT Mega hat wohl den internen Oszi mit 1MHz genutzt

T.J.
04.03.2009, 09:06
wie so oft, wenn man das zum ersten mal macht...

aufpassen bei Ponyprog, Häkchen ist 0
Ich kann dir USBASP und Burn-O-Mat mit avrdude empfehlen

programmieren kann man ganz bequem im AVRstudio mit WINAVR, falls du das nicht hast.

oberallgeier
04.03.2009, 09:21
... aufpassen ... Häkchen ist 0 ...Genau deswegen hatte ich das Bild aus PonyProg eingestellt - weil verbale Hinweise wie "... ist Null" den Anfänger verwirren und nicht helfen.


... Im Ponnyprog ist ... Bootsz1 ... aktiv
... aufpassen bei Ponyprog ... kann dir USBASP und Burn-O-Mat ... empfehlen ...Auch dort sind "die Häkchen Null" *ggggg* - weils ja immer um denselben controller geht. Wo also läge der Vorteil? Tux12Fun hat ja schon PonyProg und kann mit diesem Programm umgehen, hats ja damit auch hingekriegt. Ein Umstieg wäre also ein garnicht erforderlicher Aufwand. Ich habe mit PonyProg nie Schwierigkeiten gehabt . . . . .