Hallo, ich habe ein stk 500, allerdings suche ich noch das Testprogramm ob mein Bord auch funktioniert. Wäre schön wenn mir es jemand schicken könnte oder schreiben wo ich es finde. Schon mal vielen Dank
Programmier doch einfach mal ein Lauflicht. Den Code dazu findest Du überall.
Wenn Du mir bitte einen link dazu geben könntest wäre ich sehr dankbar. Finde einfach nicht das richtige.
nimm doch den:
1 | #include <inttypes.h> // Allgemeine Bibliotheken |
2 | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
4 | |
5 | #define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
|
6 | #define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))
|
7 | |
8 | void warte(uint16_t t) { // Funktion "Warteschleife" |
9 | uint16_t i, j; |
10 | |
11 | for (i=0;i<t;i++) { // Verschachtelte Schleife mit Befehl NOP="Tue nichts", damit |
12 | for (j=1;j<200;j++) { // die Schleife nicht wegoptimiert wird. |
13 | asm volatile ("nop"); |
14 | }
|
15 | }
|
16 | }
|
17 | |
18 | int main (void) { |
19 | uint8_t lauflicht; |
20 | |
21 | DDRB=0xFF; // Port B auf Ausgang |
22 | PORTB=0xFF; // Alle Ausgänge auf 1 |
23 | |
24 | DDRD=0xFF; // Port D auf Ausgang |
25 | PORTD=0xFF; // Alle Ausgänge auf 1 |
26 | |
27 | lauflicht=1; |
28 | for (;;) { // Endlosschleife |
29 | PORTB=~lauflicht; // Untere 8 Bit auf PORT B ausgegeben |
30 | lauflicht=lauflicht<<1; // Lauflicht um 1 Bit nach links weiterschieben |
31 | if (lauflicht==0) // Wenn Lauflicht durchgelaufen ist, dann wieder am Anfang beginnen |
32 | lauflicht=1; |
33 | warte(3000); // Warten |
34 | }
|
35 | }
|
Der Code ist für einen Atmega 16.
Oder ein "KnightRider"-Lauflicht:
1 | #include <avr/io.h> |
2 | #include <avr/delay.h> |
3 | #include <util/delay.h> |
4 | #include <inttypes.h> |
5 | |
6 | #ifndef F_CPU
|
7 | #define F_CPU 11059200UL
|
8 | #endif
|
9 | |
10 | unsigned char i; //Laufvariable für Warteschleife |
11 | unsigned char run; //Startvariable für Lauflicht |
12 | unsigned char bit; //Aufwärtslaufendes bit |
13 | unsigned char bit2; //Voraussetzung für Abwärtsschleife |
14 | unsigned char bit3; //Abwärtslaufendes bit |
15 | unsigned char speed; |
16 | |
17 | |
18 | void wait(uint8_t speed){ //Warteschleife, beeinflusst Lauflichtgeschwindigkeit |
19 | for (i=1; i<=speed; i++) |
20 | _delay_ms(10);} |
21 | |
22 | int main (void){ |
23 | |
24 | DDRB = 0xFF; //Port B als Ausgang |
25 | PORTB = 0xFF; //alle LED's aus |
26 | DDRD = 0x00; //Port D als Eingang |
27 | |
28 | bit2 = 0; //bit2 vordefinieren |
29 | bit3 = 128; //bit3 vordefinieren |
30 | while(1){ |
31 | |
32 | switch(PIND){ //Startbefehl abfragen |
33 | |
34 | case 0xFE: run=1; speed=64; break; //SW0: Start, Warteschleife wird 64 mal durchlaufen |
35 | case 0xFD: run=1; speed=32; break; //SW1: Start, Warteschleife wird 32 mal durchlaufen |
36 | case 0xFB: run=1; speed=16; break; //SW2: Start, Warteschleife wird 16 mal durchlaufen |
37 | case 0xF7: run=1; speed=8; break; //SW3: Start, Warteschleife wird 8 mal durchlaufen |
38 | case 0xEF: run=1; speed=4; break; //SW4: Start, Warteschleife wird 4 mal durchlaufen |
39 | case 0xDF: run=1; speed=2; break; //SW5: Start, Warteschleife wird 2 mal durchlaufen |
40 | case 0xBF: run=1; speed=1; break; //SW6: Start, Warteschleife wird 1 mal durchlaufen |
41 | case 0x7F: run=0; break; //SW7: Stopp |
42 | default: break; //Wenn keine Taste gedrückt: Schleife ohne Veränderung verlassen |
43 | }
|
44 | |
45 | |
46 | |
47 | if(run){ //Lauflicht einschalten bei run=1 |
48 | |
49 | if(bit2==0){ |
50 | PORTB =~bit; //bit komplementär auf PORTB ausgeben |
51 | bit = bit<<1;} //aufwärts |
52 | if (bit==0){ //ganz oben: |
53 | bit2=1; //Bedingung für Abwärtsschleife |
54 | bit=1;} //bit wieder auf Anfangswert |
55 | else wait(speed); //Warteschleife aufwärts |
56 | if (bit2==1){ //Abwärtsschleife |
57 | PORTB =~bit3; //bit3 komplementär auf PORTB ausgeben |
58 | bit3 = bit3>>1;} //abwärts |
59 | if (bit3==0){ //ganz unten: |
60 | bit2=0; //Schleife verlassen |
61 | bit3=128;} //bit3 wieder auf Anfangswert |
62 | else wait(speed); //Warteschleife abwärts |
63 | |
64 | }
|
65 | |
66 | |
67 | else { //bei run=0: |
68 | PORTB=0xFF; //alle LED's aus |
69 | bit=1; |
70 | bit3=128; |
71 | bit2=0;}} //bits auf Anfangswert, damit immer bei LED0 begonnen wird |
72 | |
73 | return 0; //never reached |
74 | }
|
Vielen Dank. Du hast mir sehr geholfen. Jetzt muss es nur noch funktionieren. Gruß Markus
Vielen Dank erst mal Patrik für deine Hilfe aber leider habe ich nach eintippen des programms wieder mal einen alten Fehler. bei mir im avr-Studiom kann wieder einmal nicht die .elf Datei erzeugt werden. Ich fange langsam an zu verzweifeln. der fehler ist "gccplug in:error:Object file not found on expected location......stk500_testprogramm.elf" Manchmal erzeugt mein avr diese elf und oft aber auch nicht. Wäre super wenn Du mir weiter helfen könntest.
Die Frage muss ich leider weiterreichen. Da kenn ich mich auch zu wenig aus. Bei mir hat immer alles funktioniert. Sorry
> der fehler ist "gccplug in:error:Object file not found on expected > location......stk500_testprogramm.elf" Wenn ich diese Fehlermeldung habe, dann habe ich normalerweise einen C-Syntaxfehler. Scrolle doch mal im Ausgabefenster etwas hoch und sieh nach, ob der Compiler einen Fehler gemeldet hat.
Vielen Dank, soweit jetzt erstmal alles OK. Hatte einen schreib fehler. dafür habe ich jetzt den nächsten fehler
In dem grünen Heft, das dem STK500 beiliegt, ist ein Assembler-Testprogramm abgedruckt. Als ich mein erstes STK500 bekommen habe (mit EEPROM), war der beiliegende AVR (AT90S...) mit dem Programm schon gefüllt und man konnte die LEDs mit Hilfe der Tasten in verschiedenen Mustern leuchten lassen. >soweit jetzt erstmal alles OK. >Hatte einen schreib fehler. >dafür habe ich jetzt den nächsten fehler C ist case-sensitiv...
STK500-Besitzer wrote: > In dem grünen Heft, das dem STK500 beiliegt, ist ein > Assembler-Testprogramm abgedruckt. Als ich mein erstes STK500 bekommen > habe (mit EEPROM), war der beiliegende AVR (AT90S...) mit dem Programm > schon gefüllt und man konnte die LEDs mit Hilfe der Tasten in > verschiedenen Mustern leuchten lassen. siehe Post von 9:58
Leider sind meine Unterlagen sehr unvollständig. Aber mein Programm ist nun schon einmal kompiliert. jetzt aber folgendes problem. "A problem when executing the command. See the command output for more Info. Tip: Check that the ISP programming frequency specified on the Board page is well below 1/4 of the clock frequency of the device. Extra precaution should be made when using the CKDIV fuse and/or clock Prescaler Register (CLKPR) on parts supporting this." Dies bekomme ich als fehlermeldung. Ich möchte mein Programm auf einen ATmega32 schreiben und habe auch einen externen Quarz von 16 MHz eingesteckt. Wäre super wenn mir jemand helfen könnte
Diese Problem haben wir in der Firma auch immer haben noch keine Lösung gefunden. Kann dir aber ein eifach Porgramm geben das es vielleicht um geht. So wie bei uns. /*********************************************************************** ***************** Projekt : Aufgabe 1 Version : 1.0 Dateiname : Licht.asm Erstelldatum : 06.08.2007 Kommentar : Die LED's sollen schwächer und heller leuchten. ************************************************************************ ***************** Chip type : ATmeag16 Clock frequency : 4 Mhz Memory model : small Internal RAM size: 16 kBytes External RAM size: -- Data Stack size : -- ************************************************************************ ***************** Datum Vers. Kommentar 17.07.2007 1.0 Änderungsgrund ************************************************************************ ****************/ .include "m16def.inc" /***********Variablen / Konstanten************/ .EQU DOWN = $00 .EQU UP = $FF .def temp = r16 ;Arbeitsregister .def temp2 = r17 ;Arbeitsregister .def save = r18 ;Verzögerungs Speicher .def richtung = r19 .def led = r20 /****************Speicher-Adressen************/ .org $0000 rjmp Init .org $002A ;Beginn Programmcode /****************Initialisierung**************/ Init: ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ;Stack initialisieren ser temp out DDRB, temp ;PORTB als Ausgang out PORTB, temp clr temp out DDRD, temp ;PORTD als Eingang ldi temp2, $0F ldi save, $30 ldi richtung, DOWN clr led /****************Hauptptogramm***************/ Main: /********************LED_AN******************/ clr led out PORTB, led ;LED leuchten lassen mov temp, save ;Delay laden Verzoegerung1: dec temp brne Verzoegerung1 /********************LED_AN******************/ /********************LED_AB******************/ ser temp out PORTB, temp ;LED ablöschen ldi temp, $FF Verzoegerung2: dec temp brne Verzoegerung2 /********************LED_AB******************/ /**********Verzögerung verändern*************/ dec temp2 ;16 mal warten bis Verzögerung ändern cpi temp2, $00 ;Verzögerung Zähler breq RichtungS rjmp Main /******************Richtung******************/ RichtungS: cpi richtung, UP breq Z_UP cpi richtung, DOWN breq Z_DOWN ;Hinauf oder Hinunter verzögern Weiter: cpi save, $30 breq Richtung_D cpi save, $01 breq Richtung_D ;Richtungs wechsel ldi temp2, $0F rjmp Main /******************Richtung******************/ /******************Zähler UP*****************/ Z_UP: push temp ldi temp, $01 add save, temp ;Verzögerung1 +1 pop temp rjmp Weiter /******************Zähler UP*****************/ /*****************Zähler Down****************/ Z_DOWN: dec save ;Verzögerung1 -1 rjmp Weiter /*****************Zähler Down****************/ /***************Richtung Drehen**************/ Richtung_D: com richtung ;Richtungs wechsel ldi temp2, $0F rjmp Main /***************Richtung Drehen**************/ /****************Hauptptogramm***************/
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.