PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Atmega8 mit vorhandenem C-Code, Probleme beim compilieren und übertragen auf den Chip



Atmeg1970
01.05.2016, 14:29
Hallo zusammen,

ich versuche momentan, einen vorhandenen C-Code für ein Lauflicht mit 6 LED
auf den ATmega8-Chip zu übertragen, den mir vor einiger Zeit ein
Elektrotechniker entwickelt hat. Leider steht mir der Bekannte aus
zeitlichen Gründen nicht mehr zur Verfügung, deshalb hoffe ich auf
Unterstützung im Forum.

Ich habe folgende Probleme bzw. Fragen:

1. Steht auf dem Chip ATmega8 L. Macht das L einen Unterschied zum
ATmega8-Chip und bei der Programmierung?
2. Dann habe ich mir damals die Frequenz "Int. RC Osc. 8 MHZ, Start-up
time 6 CK + 64 ms" aufgeschrieben. Ist diese ok oder zu hoch? In einem
ATmega8-Turtorial aus dem Internet wird 1 MHz, 6 CK + 0 ms verwendet.
3. Wurde zur Entwicklung des C-Codes CodeVision AVR verwendet. Kennt
sich jemand mit der Software aus oder gibt es eine Möglichkeit, den
C-Code für das AVR-Studio 4 umzuschreiben?
4. Verwende ich beim CodeVision AVR als Chip-Einstellung "ATmega8 L",
wie bereits in Frage 1 erwähnt. Ist das korrekt oder verwende ich besser die Einstellung "ATmega8"? Als SCK Frequenz verwende ich "57600".

Ich habe dazu auch noch ein paar Hardcopies, die passende Schaltung und
wie gesagt den fertigen C-Code. Als Betriebssystem nutze ich Windows XP und als Hardware das STK500-Board.

Danke im Voraus.

Viele Grüße

Michael

Unregistriert
01.05.2016, 18:34
1. Steht auf dem Chip ATmega8 L. Macht das L einen Unterschied zum
ATmega8-Chip und bei der Programmierung?

So wie ich das sehe, bei dir nicht. zB gehst du nicht über 8MHz. Aber schau selbst: http://www.atmel.com/images/atmel-2486-8-bit-avr-microcontroller-atmega8_l_datasheet.pdf


2. Dann habe ich mir damals die Frequenz "Int. RC Osc. 8 MHZ, Start-up
time 6 CK + 64 ms" aufgeschrieben. Ist diese ok oder zu hoch? In einem
ATmega8-Turtorial aus dem Internet wird 1 MHz, 6 CK + 0 ms verwendet.
Die 8MHz werden eine Voraussetzung für das Programm sein. Du mußt den ATMega8L auf die aufgeschriebenen Werte einstellen. Zu hoch ist sie nicht. Die 1MHz ist die Defaulteinstellung bei fabrikneuen ATmega8.


3. Wurde zur Entwicklung des C-Codes CodeVision AVR verwendet. Kennt
sich jemand mit der Software aus oder gibt es eine Möglichkeit, den
C-Code für das AVR-Studio 4 umzuschreiben?
Ich kenn mich da nicht aus.


4. Verwende ich beim CodeVision AVR als Chip-Einstellung "ATmega8 L",
wie bereits in Frage 1 erwähnt. Ist das korrekt oder verwende ich besser die Einstellung "ATmega8"? Als SCK Frequenz verwende ich "57600".
Dürfte egal sein aber nimm die Einstellung für den ATmega8L. Ist ja der, den du programmien möchtest. Falls dann was nicht paßt muß man die Ursache suchen.

Atmeg1970
01.05.2016, 22:03
Hallo, erstmal vielen Dank für die Antworten. Zum Punkt 3 habe ich das C-Programm auch als Text-Datei vorliegen. Vielleicht funktioniert das ja auch direkt mit anderen Compilern anstatt mit CodeVision wie z.B. mit WinAVR oder AVR Studio.

Anbei der C-Code:

#include <mega8.h>
#include <delay.h>

unsigned char Lauflicht1[] = {1,2,4,8,16,32};
unsigned char Lauflicht2[] = {1,2,4,8,16,32,16,8,4,2};
unsigned char Lauflicht3[] = {33,18,12};
unsigned char Lauflicht4[] = {3,6,12,24,48,33};
unsigned char Lauflicht5[] = {33,18,12,12,18,33};
unsigned char Lauflicht6[] = {9,18,36};
unsigned char Lauflicht7[] = {9,18,36,18,9};

signed char modus = 0;
int i = 0;

#define ADC_VREF_TYPE 0xC0

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1 = 0;
OCR1A = read_adc(0) * 8 + 300;
switch(modus)
{
case 0: PORTD = 63;
break;
case 1:
{
PORTD = ~Lauflicht1[i];
i++;
if (i >= sizeof(Lauflicht1))
i = 0;
}
break;
case 2:
{
PORTD = ~Lauflicht2[i];
i++;
if (i >= sizeof(Lauflicht2))
i = 0;
}
break;
case 3:
{
PORTD = ~Lauflicht3[i];
i++;
if (i >= sizeof(Lauflicht3))
i = 0;
}
break;
case 4:
{
PORTD = ~Lauflicht4[i];
i++;
if (i >= sizeof(Lauflicht4))
i = 0;
}
break;
case 5:
{
PORTD = ~Lauflicht5[i];
i++;
if (i >= sizeof(Lauflicht5))
i = 0;
}
break;
case 6:
{
PORTD = ~Lauflicht6[i];
i++;
if (i >= sizeof(Lauflicht6))
i = 0;
}
break;
case 7:
{
PORTD = ~Lauflicht7[i];
i++;
if (i >= sizeof(Lauflicht7))
i = 0;
}
break;
}

}

// Declare your global variables here

void main(void)
{
char check = 0;

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=P
PORTB=0x01;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTD=0x3F;
DDRD=0x3F;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A = 100;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;

// Global enable interrupts
#asm("sei")

while (1)
{
if (PINB.0 == 0 )
{
delay_ms(50);
if (PINB.0 == 0 && check == 0)
{
check = 1;
i=0;
modus++;
if (modus > 7)
modus = 0;
}
}
else
check = 0;

};
}

VG Michael

wkrug
02.05.2016, 16:07
Von CodeVision AVR gibt es eine free Version, die bis zu 4k Compiliert.
Das sollte für dein Programm genügen.
AVR - GCC und somit AVR Studio wird das nicht anstandslos verstehen und es müssen mit ziemlicher Sicherheit Änderungen gemacht werden.
Variablendefinitionen, Lesen aus dem Flash, Lesen und Schreiben des EEPROM.
Das alles macht CodeVision anders als das Studio.

Bei Programmieren musst Du halt aufpassen, das der Ident Code des Chips im Programmer auf ATMEGA 8 L eingestellt ist.
Sonst macht der Chip Programmer vom Studio nicht mit.

Der erzeugte Code müsste aber mit allen Varianten des ATMEGA 8 laufen.
Eventuell könnte es mit dem ATMEGA 8A Probleme geben, weil der zusätzliche Features hat, aber den willst Du ja nicht verwenden.

Atmeg1970
02.05.2016, 18:24
Hallo wkrug,
ich habe von den einzelnen Programmierschritten einmal Screenshots gemacht. Die Fuses setze ich mit dem AVR-Studio 4 und den C-Code übertrage ich mit einer älteren Evaluation-Version von CodeVision. Die Chip-Programmierung mit dem STK500 scheint auch zu funktionieren, da kein Fehler angezeigt wird, aber der Chip funktioniert in der Schaltung einfach nicht. Die Schaltung ist auf jeden Fall einwandfrei, da ein anderer Chip ohne Probleme läuft. Irgendetwas mache ich verkehrt.
VG Michael

315693157031571315723157331574315753157631577

wkrug
03.05.2016, 07:58
Ich weiss ja nun nicht, was Du alles gemacht hast, aber...
Beim ersten Bild musst Du schon den ATMEGA 8L einstellen, Dann machst Du Read Signature und dann muss ein "Match" kommen.
Geht das nicht, kannst Du die Taktfrequenz des Programmers bis auf 250kHz erhöhen. Also 250 einstellen, dann Save, dann Read -> Dann muss immer noch 250kHz drinstehen. Solange nach Read Signature keine gutmeldung kommt kann der Chip nicht programmiert werden!
Wenn das schon mal geht, hast Du schon eine Verbindung mit dem Chip.
Dann nimmst Du den Reiter Programm und wählst hier das .hex File aus, das Du vorher mit Codevision produziert hast.
Dann machst Du "Programm" und es sollte keine Fehlermeldung im Textfeld unterhalb kommen.
Wenn Du die Fuses so lässt, sollte der Chip mit internem 8MHz Generator laufen. Gibt es da noch eine CK/8 Fuse? Dann da den Haken raus machen und in den Chip schreiben.

Bei den Fuses musst Du aufpassen, wenn Du hier was falsches eingibst, kann Dir passieren, das sich der Chip nicht mehr ansprechen lässt!!!!

Bei CodeVision brauchst Du den AutoProgrammGenerator nicht, weil Du ja schon einen fertigen Quellcode hast.
Dieser Generator produziert nur die Einstellungen für die Hardware anhand der Listen, die sind aber im Original Quellcode schon drin.
Wenn Du das trotzdem machst wird dein Originaler Quellcode überschrieben und der Chip tut im Prinzip nichts.

Wenn Du das schon gemacht hast, überschreib den kompletten Auto Teil mit deinem Original Quellcode und tausche die Parts aus die auf den ATMEGA8 verweisen. Das dürften nur ein oder 2 Zeilen sein.

Dann sollte das Ganze laufen.

Atmeg1970
03.05.2016, 21:04
Hallo wkrug,
super vielen Dank für Deine ausführliche Erklärung. Werde ich testen und Dir auf jeden Fall eine Rückmeldung geben, ob es so funktioniert hat. Bin momentan leider zeitlich sehr eingeschränkt, um es sofort zu testen.
VG Michael

Hubert.G
04.05.2016, 14:41
Sollte es nicht funktionieren, ich habe den Code für das AVR-Studio4 konvertiert. Läuft auch einwandfrei.

Atmeg1970
04.05.2016, 15:07
Hallo Hubert,
das ist ja auch klasse. Daran wäre ich sehr interessiert.
VG Michael

Hubert.G
04.05.2016, 15:15
Die gepackte Projektdatei.

Atmeg1970
04.05.2016, 19:23
Super vielen Dank :-).
VG Michael

Atmeg1970
05.05.2016, 11:23
So Hubert, habe es jetzt endlich geschafft, den Chip mit dem AVR-Studio 4 zu programmieren.
Vielen Dank nochmal an alle.
VG Michael

So31587