Använda AVRlib till Atmega128, funkar inte för mig :(

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Använda AVRlib till Atmega128, funkar inte för mig :(

Inlägg av gunne »

Tjena.

Jag håller på med ett projekt där jag bland annat har en grafisk LCD, en USB-modul som kommunicerar med UART, ett externt interrupt och lite A/D-ingångar. För snabbt att få snurr på allt använder jag AVRlib och det funkar klockrent med en Atmega16 som jag labbat med. LCD, UART, externa interrupts etc funkar bra och är enkelt att implementera med AVRlib.

Men nu försöker jag byta upp mig till en Atmega128L och INGENTING fungerar. Jag har testat att implementera alla olika delar var för sig men med samma resultat: så fort jag kallar på någon av AVRlibs funktioner, t.ex. uartInit(), så låser sig programmet och går inte vidare. Kommenterar jag bort det så går programmet snällt in i en whileslinga och blinkar en diod.

Är det någon som har en ide om vad som kan vara felet?

Har suttit och försökt i typ fyra timmar nu utan resultat, håller på att bli galen. Allt kompilerar såklart som det ska utan fel.

De saker jag har testat är timer128.h, uart.h, uart2.h, ks0108.h.

Edit: Lägger in en exempelkod

Kod: Markera allt

#include <avr/io.h>	
#include "global.h"	
#include "timer128.h"

void delayo(int del);

	
int main(void) {

	timerInit();

	DDRA = 0xFF;
	PORTA = 0xF0;

	while(1) {

		PORTA = ~PORTA;
		delayo(1000);	
	}

	return 0;
}

void delayo(int del) {
	int i, j;
	for (j=0;j<del;j++) {		
		for (i=0;i<del;i++)
			asm("nop");
	}
}
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Jag gissar att det är något med make-filen. Kolla så att rätt processormodell är definierad samt att rätt källfiler och dependencies är angivna.

Vid kompilering bildas (för mig) en .lst-fil. I den syns interruptvektorerna och koden både som C och assembler. Där kan du se om AVR-lib funktionen har kompilerats. Titta också på anropet till AVR-lib funktionen; går den till rätt adress?
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

Så här ser makefilen ut:

Kod: Markera allt

###############################################################################
# Makefile for the project gDrive
###############################################################################

## General Flags
PROJECT = gDrive
MCU = atmega128
TARGET = gDrive.elf
CC = avr-gcc.exe

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -std=gnu99    -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=  -Wl,-Map=gDrive.map


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Include Directories
INCLUDES = -I"C:\AVR\gDrive\..\AVRlib" -I"C:\AVR\gDrive\." 

## Library Directories
LIBDIRS = -L"C:\AVR\AVRlib" 

## Objects that must be built in order to link
OBJECTS = gDrive.o timer128.o 

## Objects explicitly added by the user
LINKONLYOBJECTS = 

## Build
all: $(TARGET) gDrive.hex gDrive.eep gDrive.lss size

## Compile
gDrive.o: ../gDrive.c
	$(CC) $(INCLUDES) $(CFLAGS) -c  $<

timer128.o: ../../AVRlib/timer128.c
	$(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
	 $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

%.hex: $(TARGET)
	avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
	-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
	avr-objdump -h -S $< > $@

size: ${TARGET}
	@echo
	@avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
	-rm -rf $(OBJECTS) gDrive.elf dep/* gDrive.hex gDrive.eep gDrive.lss gDrive.map


## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
I "gDrive.lss" finns bland annat följande:

Kod: Markera allt

...
void timer0Init()
{
	// initialize timer 0
	timer0SetPrescaler( TIMER0PRESCALE );	// set prescaler
	outb(TCNT0, 0);							// reset TCNT0
 164:	12 be       	out	0x32, r1	; 50
	sbi(TIMSK, TOIE0);						// enable TCNT0 overflow interrupt
 166:	87 b7       	in	r24, 0x37	; 55
 168:	81 60       	ori	r24, 0x01	; 1
 16a:	87 bf       	out	0x37, r24	; 55
}

void timer0ClearOverflowCount(void)
{
	// clear the timer overflow counter registers
	Timer0Reg0 = 0;	// initialize time registers
 16c:	10 92 1c 01 	sts	0x011C, r1
 170:	10 92 1d 01 	sts	0x011D, r1
 174:	10 92 1e 01 	sts	0x011E, r1
 178:	10 92 1f 01 	sts	0x011F, r1
	Timer0Reg1 = 0;	// initialize time registers
 17c:	10 92 2c 01 	sts	0x012C, r1
 180:	10 92 2d 01 	sts	0x012D, r1
 184:	10 92 2e 01 	sts	0x012E, r1
 188:	10 92 2f 01 	sts	0x012F, r1
}
...
Vad är det? Ser ju inte ut som ren assembler i alla fall.
larsson
Inlägg: 188
Blev medlem: 9 juni 2007, 16:49:21
Ort: Göteborg

Inlägg av larsson »

För ett par år sedan hade jag liknande problem när jag bytte från mega8 eller -16 till mega 64. Helt tvärdött, inga felmeddelanden. Koden funkade perfekt på tidigare processor.

I det fallet var det en fuse-bit som hette M103C tror jag, den var satt på default från fabrik i megan. Hade nåt med kompatibilitet att göra till andra processorer. När jag stängde av den gick allt bra. Lyckas inte få hem databaladet på 128:an nu (10 kB/s från Atmel), men kolla om det kan vara nån liknande grej som spökar för dig.
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

Okej, ska kolla det där med kompatibiliteten.

Men det verkar som om de olika filerna inte länkas ihop på något sätt. Jag kan blinka en diod i mainloopen men om jag lägger den kodsnutten ( PORTA = ~PORTA) som en funktion i en separat c-fil med tillhörande h-fil funkar det ej på hårdvaran. Dock funkar det i debuggern som stegar igenom programmet som den ska.

Jag använder WinAVR och AVR Studio och lägger till filerna i projektet som vanligt, "add files to project" eller nåt i vänsterkanten. Jag ser ju att de kompileras utan problem och som sagt så fungerar programmet som det ska i debuggern.

Nu är jag hemma och sitter på en Mac så jag kan inte felsöka just nu.
larsson
Inlägg: 188
Blev medlem: 9 juni 2007, 16:49:21
Ort: Göteborg

Inlägg av larsson »

Jag brukar ha otur i spel (också) men sätter ändå fem spänn på FUSE-bitten...
Norpan
Inlägg: 2229
Blev medlem: 12 april 2008, 18:20:27
Ort: Småland

Inlägg av Norpan »

Atmel skrev:By programming the M103C fuse, the ATmega128 will be compatible with the ATmega103
regards to RAM, I/O pins and interrupt vectors as described above. However, some new features
in ATmega128 are not available in this compatibility mode, these features are listed below:
• One USART instead of two, Asynchronous mode only. Only the eight least significant bits of
the Baud Rate Register is available.
• One 16 bits Timer/Counter with two compare registers instead of two 16-bit Timer/Counters
with three compare registers.
• Two-wire serial interface is not supported.
• Port C is output only.
• Port G serves alternate functions only (not a general I/O port).
• Port F serves as digital input only in addition to analog input to the ADC.
• Boot Loader capabilities is not supported.
• It is not possible to adjust the frequency of the internal calibrated RC Oscillator.
• The External Memory Interface can not release any Address pins for general I/O, neither
configure different wait-states to different External Memory Address sections.
In addition, there are some other minor differences to make it more compatible to ATmega103:
• Only EXTRF and PORF exists in MCUCSR.
• Timed sequence not required for Watchdog Time-out change.
• External Interrupt pins 3 - 0 serve as level interrupt only.
• USART has no FIFO buffer, so data overrun comes earlier.
Unused I/O bits in ATmega103 should be written to 0 to ensure same operation in ATmega128.
M103Compability påverkar mycket, blandannat timrar och usart.
Är den fel blir det nog sk*t av ett 128 program.
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

Ni hade rätt!!!

M103C var den stora boven i dramat och nu funkar i alla fall uarten så det borde inte vara nåt problem att få igång de andra grejjerna.

Tack så mycket för hjälpen. Utan den hade jag säkert slösat bort ytterligare några dagar på felsökning...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Med tanke på allt som *inte* fungerar som vanligt i 128'an med den där
fusen satt, är det inte bättre att köra UART'en på annat sätt än via den
där lib'en ?

Det är ju bara en bakåtkompatibilitets grej och det blir inte mycket
av att "byta upp sig" till 128'an om man kör den så, så vitt jag förstår.
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

Nu förstår jag inte riktigt vad du menar. M103C var satt och därför kukade allt ur. Nu har jag rensat biten och den fungerar som en Atmega128 ska göra.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

AHA ! :-)
Glöm det, jag fick för mig att det fungerade när man körde 128'an
kompatibel med äldre processorer... :-)
Skriv svar