Zu große Daten oder Code

#3111904
Lesenswert?

Hallo,
ich arbeite noch nicht all zu lang mit den Atmegas und habe deshalb 
manchmal noch Schwierigkeiten damit. Mein Problem ist folgendes:
Ich habe erfolgreich Daten über den Usart (mit FT232RL 9600baud) an den 
PC gesendet. Wenn ich nun aber meinen Code für das ansteuern einer PS/2 
Tastatur hinzu linke, dann kommt am PC unabhängig von dem was ich sende 
nur noch 0xF5 an. Ich rufe momentan keine Funktionen aus meiner 
keyboard.c auf und trotzdem funktioniert der Usart Code nicht mehr! In 
meiner keyboard.c hab ich mehrere große Arrays in denen die Keycodes mit 
den dazu passenden Zeichen gespeichert sind. Die Arrays sind zusammen 
aber nur ~200bytes groß und mein Atmega324a hat insgesamt 2k Ram. Laut 
avr-size sollte auch alles passen. Könnte es aber dennoch sein dass ich 
irgendwas überschreibe? Ich nutze den avr-gcc in Version 4.7.2 unter 
Linux. Hat jemand eine Idee was ich falsch mache?

Grüße David


AVR Memory Usage
----------------
Device: Unknown

Program:    1508 bytes
(.text + .data + .bootloader)

Data:        238 bytes
(.data + .bss + .noinit)
#3112311
Lesenswert?

Du veranstaltest Kauderwelsch. F_CPU wind nur einmalig in EINEM Herader 
definiert, nicht mehrfach. Dieser Header muss dann halt per include 
eingebunden werden. Und ein bestehendes Macro BAUD auf SERIAL_BAUDRATE 
umzudefinieren bringt auser Arbeit und potentiellen Problemem rein gar 
nichts.

Dennoch erklärt es den Fehler nicht. Und du hast wirklich einen 20 MHz 
Quarz? Blinkt/Schaltet dein Port im 1s Takt? CLK DIV 8 Fuse inaktiv?
#3112371
Lesenswert?

Ja Ich habe einen 20MHZ Quarz. Wenn ich die Optimierung einschalte dann 
blinkt gar nichts mehr! Ohne Optimierung blinkt es irgendwo im 
Millisekunden Bereich. Es könnte sein dass der Controller abstürzt. 
Leider habe ich gerade kein Oszi um zu sehen wie regelmäßig/unregelmäßig 
die Led blinkt.
Das mit F_CPU ist mir schon klar. Die main dient hier nur als Test um 
den Serial und Keyboard Code zu testen. SERIAL_BAUDRATE verwende ich um 
die Konsistenz der Makros im gesamten Projekt zu bewahren 
(MODULNAME_KONSTANTE). Die Header sollen groß teils unabhängig von der 
Implementierung sein da der Code nicht nur auf avrs laufen soll.

Ich habe für die Fuses diesen http://www.engbedded.com/fusecalc Rechner 
verwendet. Dort und bei avrdude gibt es leider keinen atmega324a zu 
Auswahl deswegen hab ich einfach atmega324p bzw. atmega324pu ausgewählt.
Ich habe folgende Optionen verwendet:
lfuse: 0xff
hfuse: 0xd9
#3112409
Lesenswert?

@  David L. (leidav)

>Ja Ich habe einen 20MHZ Quarz. Wenn ich die Optimierung einschalte dann
>blinkt gar nichts mehr!

Ist deine Hardware in Ordung? Saubere Spannung? 100nF an VCC/GND?
Watchdog inaktiv geschaltet per Fuses?

>Auswahl deswegen hab ich einfach atmega324p bzw. atmega324pu ausgewählt.
>Ich habe folgende Optionen verwendet:
>lfuse: 0xff
>hfuse: 0xd9

Sieht OK aus.
#3112452
Lesenswert?

So, hab mal meine Schaltung hoch geladen. Ich habe bis jetzt eher 
geglaubt dass es sich dabei um ein Speicher/Segmentierungs Problem 
handelt.
Zusätzlich habe ich das Problem, dass der Code oft nach mehrmaligen 
einstecken des usb oder avr-isp Steckers nicht mehr funktioniert 
(gelöscht oder anderes komisches Verhalten). Nachdem ich dann neu 
programmiere und über avr-isp Reset auslöse dann funktioniert es wieder 
wie vorher. Könnte es sein dass sich der avr in den parallel 
Programmiermodus schaltet?
Angehängte Dateien:
#3112487
Lesenswert?

@  David L. (leidav)

>geglaubt dass es sich dabei um ein Speicher/Segmentierungs Problem
>handelt.

Man sollte erstmal von einfachen Ursachen ausgehen, siehe 
Fehlersuche.

>Zusätzlich habe ich das Problem, dass der Code oft nach mehrmaligen
>einstecken des usb oder avr-isp Steckers nicht mehr funktioniert

Warum tust du das? beim Entwickeln bleibt der Programmieradapter 
praktisch immer gesteckt.

>(gelöscht oder anderes komisches Verhalten). Nachdem ich dann neu
>programmiere und über avr-isp Reset auslöse dann funktioniert es wieder
>wie vorher.

Dann hast du möglicherweise ein Resetproblem.

> Könnte es sein dass sich der avr in den parallel
> Programmiermodus schaltet?

Nein.

In deinem Schaltplan ist ein 18,432 MHz Quarz eingezeichnet. Was ist 
denn nun WIRKLICH bestückt? Ansonsten sieht der Schaltplan OK aus.
Schalte auch mal den Brown Out Detektor ein mit 4,x V.
#3112508
Lesenswert?

Ich habe die Platine momentan mit 2x 20Mhz bestückt da Farnell mir den 
anderen Quarz nicht rechtzeitig liefern konnte.
Mit mehr mal ein/aus stecken meinte ich das die Platine nicht mehr 
funktioniert wenn ich sie z.b einen Tag später wieder verwenden möchte 
und neu anstecke. Ich werde jetzt mal die Brown Out Detektion probieren.
#3112852
Lesenswert?

Das ruft Erinnerungen wach, als ich mal eine Toolchain mit zu 
generischem Startcode hatte. Die hat stillschweigend Adressen mod 4k 
angesprungen, was nur zum Tragen kam, wenn z.B. durch "zu große" 
initialisiert Daten eine Jumptable zu weit hinten landete. Verwendet du 
zufällig eine crossdev-toolchain unter Gentoo? Dann upgrade mal crossdev 
auf unstable und bau die AVR-tc von Grund auf neu.
#3112989
Lesenswert?

Eigentlich müsste mein Makefile doch funktionieren?
1
PROGNAME=prog
2
MMCU=atmega324a
3
FORMAT=ihex
4
PROGRAMMER=stk500v2
5
PART=m324a
6
PORT=/dev/ttyACM0
7
PROGCLK=10
8

9
CC=avr-gcc
10
OBJCOPY=avr-objcopy
11

12
AVRDUDE_PARAMS= -B $(PROGCLK) -c $(PROGRAMMER) -p $(PART) -P $(PORT)
13
CFLAGS= -mmcu=$(MMCU) -std=gnu99 -Os -Wall
14
LDFLAGS=
15
OBJ= main.o serial.o keyboard.o
16

17
all: $(PROGNAME).hex
18

19
clean: 
20
  rm $(PROGNAME).hex $(PROGNAME) $(OBJ)
21

22
programm:
23
  avrdude $(AVRDUDE_PARAMS) -U flash:w:$(PROGNAME).hex
24
fuse:
25
  avrdude $(AVRDUDE_PARAMS) -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xfc:m 
26

27
$(PROGNAME).hex:  $(PROGNAME)
28
  #$(OBJCOPY) -j .text -j .data -O $(FORMAT) $(PROGNAME) $(PROGNAME).hex
29
  $(OBJCOPY) -O $(FORMAT) $(PROGNAME) $(PROGNAME).hex
30

31
$(PROGNAME): $(OBJ)
32
  $(CC) $(LDFLAGS) -o $(PROGNAME) $(OBJ)
33

34
%.o : %.c
35
  $(CC) $(CFLAGS) -c $<

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren