Zusatz,im C Programm zu finden in der asuro.c!
Das müsste die Interupt Service Routine in C sein.
Code:SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz)
timebase ++;
if (Ovr2IntFunc)
Ovr2IntFunc();
}
Druckbare Version
Zusatz,im C Programm zu finden in der asuro.c!
Das müsste die Interupt Service Routine in C sein.
Code:SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz)
timebase ++;
if (Ovr2IntFunc)
Ovr2IntFunc();
}
Hallo zusammen,
falls es jemanden interessiert, wie der von Arthur S. oben gezeigte Code (das TCNT2) in der LIB zustande gekommen ist, um den 36 kHz Takt mit einem Ratio (an/aus-Verhältnis) von 50% hinzubekommen, kann mal (etwas versteckt) unter der ASURO als Wecker (Ab Punkt 2: beschrieben) eine Beschreibung finden.
Wer noch ein paar allgemeinere Infos zu Interrups benötigt findet etwas weiter vorher unter der ASURO als Wecker (mittendrin) auch dazu etwas.
Das hat nichts mit eurem Problem zu tun, könnte aber allgemein lesenswert sein und wurde 2 Post vorher auch von Arthur S. in Kurzform zusammengefasst.
Gruß Sternthaler
AHHHHH,Sternthaler!
Ich dreh durch,hätte ich diesen sehr hilfreichen Thread von dir nur eher entdeckt. 8-[
Aber naja,so hab ichs selber hingefriemelt. Trotzdem Respekt zu diesem Thread,der ist wirklich sehr verständlich.
Gruß
Hi Arthur S.,
danke für das Lob. Bekommst du gleich von mir zurück, da das 'selber hingefriemelt' nämlich eine mordsmäßige Wühlerei in der Doku und den Registern ist. Geschweige denn, wenn man so etwas selber hinbekommen würde. Aber die Leistung bleibt auf immer und ewig nun bei waste.
Um nun zu zeigen, was du so drauf hast ;-), wäre ich sehr stark an deinem Assembler-Code interessiert.
Bis jetzt war ich selber immer zu faul mal ein Grundgerüst anzulegen und auf dem mega8 mit Assembler zu beginnen. (OK, Grundgerüst ist ja im wiki.)
Dieses IR-Hindernis-Ding ja auch schon in einigen anderen Thread’s eingezogen, aber bis jetzt immer nur in C.
Bestimmt hast du ja Abstände im Timerinterrupt schon besucht. Und wenn nicht, wäre es mal eine Anregung, falls du es nicht schon in Assembler hast, das IR-Geraffel komplett in Assembler im Interrupt zu 'versenken'. Und alle werden dich ohne Ende loben ;-).
Egal wie, weiterhin viel Erfolg und Spaß
Gruß Sternthaler
So hier wie von Sternthaler gewünscht erstmal der grundlegende Code für IR-Kollision in Assembler. Die _Inits am Start und die Inc-Dateien ganz oben sind selbst geschriebene Makros um nicht jedes mal die LED's ,Stack etc zu initialisieren. Programm funktioniert wie folgt: Sobald IR anschlägt gehen die Back LED's an. Sendeleistung müsste hier im Programm eingestellt werden,hatte noch keine Zeit mich weiter damit zu befassen (es ist Prüfungszeit).
Der Code:
Für Fragen stehe ich jederzeit zur Verfügung! =P~Code:.include "m8def.inc" ;Deklaration für Atmega8
.include "Stack.inc" ;Inc-Datei für Stack
.include "UART.inc" ;Inc-Datei für Uart
.include "Motor.inc" ;Inc-Datei für die Motoren
.include "BackLED.inc" ;Inc-Datei für Back LED's
.def temp0=R16 ;Benennung der
.def temp1=R17 ;Arbeitsregister
.def temp2=R18
.def temp3=R19
.def temp4=R20
.def temp5=R21
.def temp6=R22
.def temp7=R23
.def temp8=R24
.def temp9=R25
.CSEG ;Program-Flash
rjmp Start ;Sprung
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
reti ;rjmp ADC ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface
Start:
Stack_Init temp0 ;Initialisierung als Makro
Uart_Init temp0 ;Initialisierung als Makro
Pwm_Init temp0 ;Initialisierung als Makro
Motor_Init temp0 ;Initialisierung als Makro
LED_Init temp0 ;Initialisierung als Makro
;--------------------------------------------------------------------------------
in temp0,ddrd ;PD1 als Ausgang
ori temp0,0b00000010 ;nach dem Read-Modify-Write
out ddrd,temp0 ;Prinzip
cbi portd,1 ;PD1 auf LOW
;-------- seriell interface programmed in boot routine and already running -------
; prepare 36kHz for IR - Communication using 8-bit timer 2
ldi temp0,(1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21)| (1 << CS20)
out TCCR2, temp0 ;Timer2 Einstellungen
ldi temp0,0xF7 ;einzustellender Wert für die PWM
out OCR2,temp0 ;in das Output Compare Register
in temp0, TIMSK ;Timer2
ori temp0, (1<<TOIE2); ;Overlow Interupt
out TIMSK, temp0 ;enable
sei ;global Interupts enable
loop: SWITCH_LEFT_BACKLED_OFF
SWITCH_RIGHT_BACKLED_OFF
sbic pind,0 ;Abfrage des Empfängers auf Null,da dieser auf LOW
rjmp loop ;gezogen wird bei Empfang
SWITCH_LEFT_BACKLED_ON
SWITCH_RIGHT_BACKLED_ON
rjmp loop
TIM2_OVF: ;Interupt Service Routine für den Overflow des Timers2
push temp0
in temp0,sreg
push temp0
in temp0,tcnt2
subi temp0,-0x25
out tcnt2,temp0
pop temp0
out sreg,temp0
pop temp0
reti
Hallo Arthur S.
so als Muster sieht die Welt für einen C-Progger und meistens nur ASM-Leser doch schon viel übersichtlicher aus.
Nett finde ich deine Addition von 0x25 mit dem SUBI temp0, -[/b]0x25. Das hätte ich, wenn überhaupt, nur in den Outputs vom C-Compiler entnommen. Ansonsten hätte ich das ADD, mit einem weiteren LDI davor benutzt.
Mir fehlen hier natürlich die *.inc-Dateien als AVR-ASM-Starter ganz enorm. Ich gehe mal davon aus, dass auch die SWITCH_[LEF|RIGHT]_BACKLED_[ON|OFF] als Macro dort versteckt sind. Und was fehlt mir sonst noch?
Die eigentliche Arbeitsschleife könnte doch folgendermaßen auch funktionieren?Wenn ich das so weit richtig eingebaut haben sollte, würde ich mir davon versprechen, dass die LED's nicht permanent an- und ausgeschaltet werden bei einem Hindernis, und so heller leuchten müssten. Kann das so gehen?Code:loop: SWITCH_LEFT_BACKLED_OFF
SWITCH_RIGHT_BACKLED_OFF
loop_0: sbic pind, 0 ; Abfrage des Empfängers auf Null, da dieser
rjmp loop2 ; auf LOW gezogen wird bei Empfang.
SWITCH_LEFT_BACKLED_ON
SWITCH_RIGHT_BACKLED_ON
loop_1: sbis pind, 0 ; Warten, bis das Hindernis wieder weg ist.
rjmp loop_1
rjmp loop
Und hier natürlich auch ein 'thanks a lot' für deinen Code.
Viel Erfolg bei den Prüfungen.
Gruß Sternthaler
Hallo alle zusammen,
ich bin neu hir.
29 Jahe Alt Elektrotechniker.
habe seid 3 Tagen meinen Asuro.
habe alles schön zusammen gabaut, gelötet ( auch die finger verbrannt) bitte nicht lachen :-) .
Nach ein paar anlaufschwierigkeiten mit der übertragung geht nun alles.
Ausser ( nu kommts )
wenn ich das selftest übertrage oder mit der Easy asuro geht alles, alles was ich will.
Nur wenn ich sebst eins schreibe in c mit der mitgelieferten software, oder sogar die von hier geposteten mir stibitze.
Meine frage an euch:
Muss ich mehrere make und clean files erstellen.
Wie lege ich ein eigenes projet an? Ich nehme immer die test.c lösche da alles und schreibe wie in der anleitung beschrieben, nur dann geht nichts.
oder kopiere was fertig geschriebenes rein, dann werden immer beim Selftest 84 pages übertragen und und im first try 24 wobei da nur die Status LED grün bleibt.
Oder wie geht ihr vor.?
Wie gesatgt und Bei easy asuro hab ich schon ein ausweichen mit lansamen rückwerts faht drehung und wieder schneller Vorwertsfahrt hinbekommen. weil 1 kann die easy asuro nicht ; die lienien vervolgung und gerade das ist was ich nutzen möchte ( schwartze Fugen in der Wohnung) naja oder sehr dunkelgrau.
Für eine kleine stütze währ ich escht dankbar,
LG
Ps: wehr rechtschreibfehler findet kann sie behalten
Hallo little.r2d2,
Spontan ist mir jetzt sofort ein Sketch der Gruppe "Badesalz" eingefallen, kennst Du die? O:)Zitat:
ich bin neu hir.
29 Jahe Alt Elektrotechniker.
Aber Scherz bei Seite: Am besten ist, wenn Du gleich AVR-Studio installierst und damit Deine ASURO-Projekte machst. Das Programm gibt's kostenlos von Atmel und man kann damit auch Debuggen.
Gruß,
robo
hehe, Hi robo
ja kenne ich
Ich habe das originale Winavr installiert was bei dem lieverumfang dabei war
habe gestern ganzen tach drann gesessen und mir die finger blutig getippt.
Naja ich install mal das neue, aber hab kein ahnung was ich falsch mach.
Soo habe nun avr studio 4 installier
Nun weiss ich nicht ob oder wo ich die make files brauche oder finde.
Da bei der Asuro software ja auch mehrere test Programme dabei sind, was ich gleich poste, würde ich die gern testen weil sie ja auch so heissen :)
Code:#include "asuro.h"
#define SPEED 0x8F
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}
void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}
void LineDemo(void)
{
int i;
unsigned char j;
Init();
FrontLED(ON);
for (j = 0; j < 0xFF; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}
__________________________________________________ ____________
nur wie bekomme ich jetzt vom avr erzeuten programme in eine hex datei oder wie übermittle ich das ganze? Diesen progamm konnte ich nicht mal mit der originalen Winavr nutzen ....
LG[/code]