PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : welchen Compiler



michas_rob
01.11.2007, 21:39
Hallo an alle,

welchen compiler, außer WinAvr, kannst du mir empfehlen...

Danke

Gruß michael

Hubert.G
02.11.2007, 09:56
Kostenlose kenne ich sonst keine.
CodeVision für AVR, Keil für AVR

Felix G
02.11.2007, 10:10
Wo liegt denn das Problem beim AVR-GCC (also WinAVR)?

der funktioniert doch eigentlich recht zuverlässig, und wenn man ihn ins AVR-Studio einbaut hat man sogar sowas wie eine IDE.

michas_rob
02.11.2007, 20:03
Hallo,

danke für eure Antworten...

@Hubert.G
Hast du schon mit einem von diesen Compiler Erfahrungen gesammelt und welchen könntest du weiter empfehlen?

@Felix G
ICh habe so einige Schwierigkeiten beim Compilieren, vielleicht liegt es auch an mir, aber wenn die Optimierung der Compilierung z.B.: auf Os, aber eigentlich funktioniert es nur mit O0, eingestellt ist funktioniert der Code nicht mehr richtig.

aktuelles Probelm:
Mittels einem Interrupt ein zyklisches Blinken "Heart Beat".

main.c:

#include <avr/io.h>
#include "common.h"
#include "isr.h"

int main(void) {

init_ISR();

DDRD = 0x10;
PORTD = 0x10; // HeartLed
DDRC = 0x1C;
PORTC = 0x10;

while(1) {
if (Counter_X_20ms > 0x03) {
if ( (PIND & 0x10) != 1 ) {
PORTD |= 0x10;
}
}
if (Counter_X_20ms < 0x02){
if ( (PIND & 0x10) != 1 ) {
PORTD &= 0xEF;
}
}
}
return 0;
}


isr.c:


#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdio.h>
#include "common.h"



void init_ISR(void) {
sei();
TIMSK |= ( 0x01 << TOIE0 ) ;
TCCR0 |= ( 0x01 << CS02 | 0x00 << CS01 | 0x01 << CS00 ) ;
TCNT0 = 0x64;
Counter_X_20ms = 0x00;
}



ISR(TIMER0_OVF_vect) {
if ( Counter_X_20ms == 0x32 ) { // 1 sek
Counter_X_20ms = 0x00;
} else {
Counter_X_20ms++;
}
TCNT0 = 0x64;
TIFR |= ( 0x01 << TOV0 ) ;
}


Counter_X_20ms ist in der common.h als uint8_t definiert....

Dieser Code funktioniert eiwandfrei mit der CompilerStufe O0, aber mit allen anderen nicht mehr?

Vielleicht habe ich auch nur eine falsche Einstellung?

Danke

mfg Michael

izaseba
02.11.2007, 20:35
Counter_X_20ms ist in der common.h als uint8_t definiert....
dann versuch mal volatile uint8_t zu nehmen und schon klappt es mit der Optimierung ;-)

und


TIFR |= ( 0x01 << TOV0 ) ;
kannst Du auch weglassen.
1. ist es falsch
2. das macht die Hardware für Dich

Gruß Sebastian

Hubert.G
02.11.2007, 20:39
Mein Junior hat während des Studiums mit CodeVision gearbeitet und war sehr zufrieden, ein junger Arbeitskollegen in der Abendschule mit Keil und war auch sehr zufrieden. Sie kosten halt etwas.
Es werden dir nur diese Kompiler auch nichts helfen. Wenn bei mir der Kompiler etwas wegoptimiert, dann habe ich sicher irgendwo einen Fehler gemacht, eine Variable in einer ISR nicht als volatile gekennzeichnet oder so etwas. Probiere das mal mit Counter_X_20ms.
Hubert

michas_rob
02.11.2007, 20:43
Danke Danke Danke,

genau das war es...
Ich habe echt "alles" ( hab ich gedacht) ausprobiert...

Na dann werde ich mir gleich meinen alten Code raus krammen, bei diesem hatte ich schon mal so ein ähnliches Problem, und werde es dort ausprobieren.

Danke Michael