PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SOLVED] Quellcode bingt Verzweiflung.



Tux12Fun
07.03.2009, 16:39
Hallo,

ich habe ein Stück Quellcode, der mich zur Zeit zum verzweifeln bringt.
Inzwischen habe ich das ganze soweit gekürzt dass nur noch folgendes übrig geblieben ist.



int main(void){

DDRC=0xff;
PORTC=0xff;

DDRA=0x00;
PORTA=0xff;

PORTC &= ~(1<<PC2); //ON
_delay_ms(1000);
PORTC |= (1<<PC2); //OFF
_delay_ms(1000);


while (1){
PORTC &= ~(1<<PC0); //ON
PORTC &= ~(1<<PC2); //ON
_delay_ms(BIT_1_DURATION);

PORTC |= (1<<PC0); //OFF
PORTC |= (1<<PC2); //OFF
_delay_ms(BIT_GND_DURATION);
}
}



An PC0 und PC2 hängt je eine LED. Die PC0 Led blinkt schön, so wie es sein sollte. Jedoch blinkt die PC2 Led nicht mit. Am Anfang 1x an und aus geht aber.

McJenso
07.03.2009, 16:47
Hallo,

JTAG deaktiviert?

Gruß

Jens

oberallgeier
07.03.2009, 16:56
... An PC0 und PC2 hängt je eine LED ...Mega32 ? Jtag Pin enable (Fuse gesetzt?)

Im Doc steht: If the JTAG interface is enabled, the pull-up resistors on pins PC5(TDI), PC3(TMS) and PC2(TCK) will be activated even if a reset occurs.

Tux12Fun
07.03.2009, 16:57
Ja, ist glaub ich der Fall. Habe folgende Einstellungen vor ein paar tagen mal gesagt bekommen:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=46715
(unten das Bild)

Kann ich JTAG einfach aktivieren oder hat das irgendwelche anderen Auswirkungen?

Tux12Fun
07.03.2009, 17:02
Und noch eine Frage, warum funktioniert dann das erste mal an aus ?

oberallgeier
07.03.2009, 17:05
... Kann ich JTAG einfach aktivieren oder hat das irgendwelche anderen Auswirkungen?
...Im Doc steht: If the JTAG interface is enabled... and PC2(TCK) ...
DE aktivieren !

Ungefähr so könnten die Fuses aussehen: 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&O_BITS=Apply+fuse+bits

Auf jeden Fall musste JTAGEN disablen.

Tux12Fun
07.03.2009, 17:11
also wenn ich meine Fuse Bits richtig lese ist JTAG ausgeschaltet

oberallgeier
07.03.2009, 17:24
Ach so - noch ne Frage:

Wie groß ist BIT_1_DURATION und BIT_GND_DURATION ? ? Immerhin steht oben:

... soweit gekürzt dass nur noch folgendes übrig geblieben ......und in diesem Rumpfstück werden weder der Controller noch diese beiden Werte definiert. Ich nehme auch an, dass Du zwei verschiedene Werte benötigst, sonst könntest Du das Ganze kürzer schreiben, indem Du die Bits nur toggelst (jeweils umschaltest). Ungefähr so:

while (1)
{
PORTC ^= ((1<<PC0)|(1<<PC2)); // 2 Portpins toggeln
_delay_ms(BIT_GND_DURATION);
}

Tux12Fun
08.03.2009, 01:02
BIT_1_DURATION ist per define auf 10*1000
BIT_GND_DURATION ist per define auf 20*1000

Im Moment geht es mir nicht darum die 2 Pins mit einem Befehl zu toggeln, sondern ich würde gern verstehen, warum das toggeln von je einem Pin nicht funktioniert, bzw. was mein bereits stark gekürzter quellcode da anders macht als ich es mir dachte

oberallgeier
08.03.2009, 08:32
Hi,

... soweit gekürzt dass nur noch folgendes übrig geblieben ...
... Im Moment ... würde gern verstehen, warum ... mein bereits stark gekürzter quellcode ...Tja, da Du nur einen Teil des ganzen Codes gepostet hast und über Deinen Controller sowie über Deine Fuses auch nix bekannt ist , weigert sich meine Glaskugel was dazu zu sagen. Jedenfalls laufen Deine knappen Zitate mit den unterschiedlichen DURATION´s bei mir, mit meinen eigenen (nicht weggekürzten) defines und includes, dem nicht erlaubten JTAGEN und all dem dämlichen Schrott auf meinem m32 korrekt - dauert halt etwas lange der Blinkzyklus . . . . .

Tux12Fun
08.03.2009, 12:16
Hallo

hier ist der komplette code meiner aktuellen main.c



#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#define MCU = AVR_ATmega32
#define F_CPU 16000000 // Quarz 20 Mhz-CPU
#include <util/delay.h>
#define BIT_COUNT_DELEY 1000 //Basiseinheit für Counter
#define BIT_GND_DURATION 20*BIT_COUNT_DELEY
#define BIT_0_DURATION 5*BIT_COUNT_DELEY
#define BIT_1_DURATION 10*BIT_COUNT_DELEY
int main(void){
DDRC=0xff;
PORTC=0xff;
DDRA=0x00;
PORTA=0xff;
PORTC &= ~(1<<PC2); //ON <<hier funktionierts
_delay_ms(1000);
PORTC |= (1<<PC2); //OFF
_delay_ms(1000);
while (1){
PORTC &= ~(1<<PC0); //ON
PORTC &= ~(1<<PC2); //ON << hier nicht mehr
_delay_ms(BIT_1_DURATION);
PORTC |= (1<<PC0); //OFF
PORTC |= (1<<PC2); //OFF
_delay_ms(BIT_GND_DURATION);
}
}


Mit diesem Code bin ich gerade am tesen. Jedoch ohne erfolg.

Wenn ich die Zeile ON / OFF bei hier funktionierts auch noch rausnehme. Bleibt die LED für immer aus. Aber eigentlich müsste die doch unten auch getriggert werden.

robocat
08.03.2009, 12:56
_delay_ms(x) geht nicht beliebig lange. ich weiss allerdings auch nicht genau, wie lange man warten kann. 1000ms funktioniert definitiv noch, bei deinen 10/20 sekunden bin ich fast sicher, dass es nicht mehr gehen wird. da dann besser eine for schleife und ein dafür kürzeres delay verwenden.

gruesse

McJenso
08.03.2009, 13:01
Hallo,



#include <avr/io.h>
#define MCU = AVR_ATmega32
#define F_CPU 16000000

int main() {
DDRC = (1<<PC2);
while (1){
}
return 0;
}


bitte ohne Optimierung kompilieren und testen.
Leuchtet die LED?
Wenn nicht gib uns bitte deine aktuellen(!) Fusebiteinstellungen.
Verweise nicht auf ein altes Bild, schaue nach und berichte. ;-)

Gruß

Jens

Edit: Hab jetzt nich im DB nach geschaut. Aber du hast Avcc angeschlossen, ja?

Tux12Fun
08.03.2009, 13:46
Also laut Pony Prog sind folgende Fuses gesetzt:
BODLEVEL = 0
CKSEL0 = 0
Der Rest ist 1
(gerade frisch ausgelesen)
Der Code mit 0 Optimierung im Makefile brachte keinen Unterschied.

Jetzt habe ich den Code in einen anderen ATMEGA32 geschossen.
und habe das gleiche Ergebnis.

Avcc war nicht angeschlossen. Jedoch kein unterschied, als ich Avcc versorgt habe.

Die Hex File wird euch auch nichts bringen oder ?

Tux12Fun
08.03.2009, 13:58
Ich glaube ich habe den Fehler eben gefunden. Bricht folgt soweit ich weiß ob es das wirklich war.

McJenso
08.03.2009, 14:05
Hallo,

das sieht mir jetzt nach Hardware Fehler aus. Wenn du den AtMega 32 raus ziehst und an den Sockel (PC2) eine Brücke nach GND steckst müsste die LED ja leuchten. Ich habe durch deinen vorherigen Code angenommen, dass du GND schaltest und die andere Seite der LED an Vcc angeschlossen hast. Das ist wohl richtig.
Wenn du mit dem AVR Studio arbeitest, hast du den richtigen Controller unter Projekt eingestellt?

Gruß

Jens

Tux12Fun
08.03.2009, 14:05
Also der Fehler lag auf dem Steckbrett auf dem ich experimentiert habe. Anscheinend hat die 2. LED nur stom bekommen, wenn die erste aus war. Genau kann ich gar nicht mehr sagen, wie ich die Konstelation hinbekommen habe.

Auf jeden Fall danke an alle, die mit hier weitergeholfen haben. Finde das echt Klasse von euch. Gerade, wenn man erst anfängt mit dem Microcontrollern zu arbeiten gibts halt so viele Stellen wo etwas schief laufen kann.

oberallgeier
08.03.2009, 14:59
Hi, alle

Bin erst jetzt wieder zurück "am Boden/der Tatsachen". Mittlerweile ist der Fehler wohl gefunden und die Softwarefehlersuche hat einen Hardwaremangel als Schuldigen erkannt (ich habe keine Ahnung, wie oft mir das schon passiert ist *brrrrrrrrr*).
... bitte ohne Optimierung kompilieren und testen ...Das würde evtl. eine Fehlermeldung erzeugen, weil in der delay.h steht:

#ifndef __OPTIMIZE__
# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
#endif
Ich habe aus verschiedenen Gründen (m)eine eigene delay irgendwo "gefunden":


// ================================================== ===============================
// ### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !

void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
// ================================================== ===============================
Da habe ich eindeutig uint_16 - seeeehr praktisch. Die delay.h operiert dagegen mit "_delay_ms(double __ms)" - und ich glaube bei double und AVRGCC gibts gelegentlich Probleme . . . . hat ja schon robocat angemerkt.

... Hinweis: z.Zt. existiert im avr-gcc kein "echtes" double, intern wird immer mit "einfacher Genauigkeit" ...

McJenso
08.03.2009, 15:05
Hallo,

ohne Optimierung bezog sich nur auf meinen ultraeasykurzundschmerzlosen Testcode. :-)

Gruß

Jens