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]
Die Makefiles brauchst Du nicht. Du muss ein Projekt im AVR-Studio anlegen und asuro.c, asuro.h einbinden.
du brauchst avrstudio nicht unbedingt. wichtig ist nur: ERST speichern, DANN kompilieren.
hi,
joa mit dem AVR Studio komm ich nicht so zurecht
hab mir nochmal Winavr 2008... runtergeladen das sieht besser aus.
wobei ich nun alle demo programme übertragen, aba geht nicht 1
ich denke ich mache immer noch was falsch
Also ich nehme die originale test.c lösche da alles copiere die originale demo linienfolgen programm ein oder auch was anderes. geht aber nicht
wen ich was selbs schreibe aber nur die led, geht es. naja ab und zu.
füge ich dann wieder was ein was dann geht wieder nur die grüne sys led.
gehn die Originalen test programme?
Da ist auch 1 dabei wen ich die beschreibung richtig verstanden habe das
wenn ich es übertagen haben. k1 für sebsttest, k2 für lieniendemo k3 für irftest, drücke dann die programme ablaufen. aba gefunzt hts noch nicht,
aber danke für den tip mit dem speichern werd ich mal testen.
Hallo little.r2d2,
Ich hatte letzten September/Oktober bei NULL angefangen (hatte lediglich vor 15-20 Jahren sehr viel FORTRAN mit Assembler gemacht) und ich bin vom ersten Tag an prächtig mit AVRStudio zurandegekommen. Musste allerdings die neueste Version holen.Zitat:
Zitat von little.r2d2
Ich hatte nie ein makefile bearbeitet oder ähnliche Dinge gemacht. Hatte in AVRStudio ein neues Projekt eröffnet, den Zielprozessor ausgewählt, die Projektdatei benannt (das ergibt dann eine neue, projektbezogene directory), dann einfach den Code geschrieben, erst in Assembler, später in C, compiliert und den Hexfile (liegt im subdirectory "default"), teilweise auch für den asuro, auf das Zielsystem geflasht. Beim asuro hatte ich mit dem Flash.exe über IR geflasht. Fazit zu AVRStudio:
Wenn Du NICHTS machst, machst Du es richtig.Zitat:
Zitat von little.r2d2
PS: Du kannst, wenn Du magst, dies hier ausprobieren - bei mir läufts a) mit AVRStudio, mit Flash.exe und auf dem asuro.
1) Starte AVRStudio.
2) Mach im AVRStudio ein neues Direktory z.B. test-schleich auf.
3) gehe auf den normalen Desktopbildschirm
4) kopiere alle files aus dem *zip in dieses directory test-schleich
Einfach ALLES in das "neue" directory schreiben
5) Öffne die test.c im notepad (dem einfachen Editor).
6) Wähle den kompletten Text der test.c - kopiere mit paste & copy
7) Füge die test.c in das AVR-Codefenster ein
8 ) Drücke - im AVRStudio [F7]
9 ) Flashe den File mit Flash.exe - er liegt in ..\test-schleich\default.
10) vermutlich freust Du Dich danach
ok habe nun das avr drauf und volge mal den anweisungen
das muss doch klappen vorallem die ariginal geschriebenen
soo test... :)
hmmm so gehts nicht?
nur rote punkte 11 errors 9 warnungen
ok noch mal aber etwas besser ( aber immer noch nicht)
bzw wo mache ich da ein neues directory
1-5 hab ich gemacht
dann öffne ich AVR Studio
wähle mein schon angelegtes projekt aus ( ist das noch richtig? )
öffne new file
Paste alles da rein Dann F7 / ratter ratter Ohne error
Aber nirgend wo eine hex zu finden die, die erzeut wird ist die von test.c original
Hmmpf
binn zu doof Aba muss doch klappen naja morgen wieder.
Lg
NEIN ! Sorry - es war mein Fehler !Zitat:
Zitat von little.r2d2
stimmt - ich hatte vor einiger Zeit meinen asuro-Pfad umgebogen, ich kenne Deinen nicht - also habe ich jetzt mal eine Holzfällermethode probiert (ich wohne in den Oberallgäuer Bergen, das ist Bayern, da sind die Holzfäller daheim). Diese unvorschriftsmässige Vorgehensweise ist hier beschrieben, aber sie ist wirklich unseriös. Halt quick and dirty - sorry - im Moment schaff ich es nicht sauber.Zitat:
Zitat von little.r2d2
ah ok,
ist ja kein ding, vieln dan für den link.
werde mich heute mittag mal drann machen.
Es eilt ja auch nicht, kann ja bissel experimentieren.
Lg
Grüß Dich, little.r2d2,
die Fahrt des asuro ist bei mir mit den aktuellen Parametern recht holprig. Das Programm hatte ich geschrieben, um die Minimalgeschwindigkeit des asuro auszutesten - und aktuell ist er gestern bei mir recht seltsam gefahren - mal ein Motor vorwärts, mal der andere. Wenn das bei Dir auch so ist, dann liegt es also NICHT am flaschen *gggg* sondern am Programmierer . . . .
hallo little.r2d2,
ich hab mich mal in den problem hinein gelesen und ich kann nur sagen, es funktioniert auch ohne AVRStudio (nichts gegen dieses programm!!).
nun zu meiner version:
angefangen habe ich mit Programmers Notpade (original version von der CD) und den mitgeleiferten beispielprogrammen:
immer inhalt von test.c gelöscht und eigenes programm eingefügt, dann compiliert (laut anleitung, make und clean eingerichtet), test.hex aus dem verzeichnis kopiert und umbenannt, damit ich es später noch habe und dann wieder ein neues programm geschrieben.
später habe ich mir die erweiterte lib (v2.7 oder v2.8 ) von hier herunter geladen und auch die neuere version von programmers notpad
dadurch hat sich einiges geändert:
man braucht bei notpad keine make und clean einrichten, sondern kann die voreingestellten verwenden
als erstes kopiere ich mir einen ordner aus den exampels ( im verzeichnis der lid), zb. motortest und benenne ihn um, zb. eigenes_programm, dann öffne ich das test.c, ändere den programm-code um und kompiliere das ganze
zum übertragen auf den asuro verwende ich eine neuere version von flash (müsste aber mit der originalen auch funktionieren)
achso, hab ich glatt vergessen: immer vor dem kompilieren unbedingt speichrn!!!!!
hoffe, dass es dir weiter hilft
hmm also bei mir fährt er nur im kreis.
obwohl
Init();
MotorDir(BREAK,BREAK);
MotorSpeed(120,120) <----- bedeutet doch beide motoren FWD
das linke rad bleibt stehn und das recht fähr bis ich ihn wieder aus mache.
selbst die geschwindigkeiten habe ich erhöt und veringert.
wenn ich dann am linke rad drehe dann bleibt das rechte mal stehn das linke zuckt usw...
wie ist das mit der lib brauch ich die neuste unbedingt?wenn ich die originale test ändere also was eigenes mache passiert nichts ausser grüne led. das mit der StatusLED(RED) geht aber mehr nicht selbs wenn ich fertige programme einfüge wie zb die demo versionen.Zitat:
angefangen habe ich mit Programmers Notpade (original version von der CD) und den mitgeleiferten beispielprogrammen:
immer inhalt von test.c gelöscht und eigenes programm eingefügt, dann compiliert (laut anleitung, make und clean eingerichtet), test.hex aus dem verzeichnis kopiert und umbenannt, damit ich es später noch habe und dann wieder ein neues programm geschrieben.
PS ich speicher immer erst dann kompiliere ich.
nein, du musst nicht immer auf dem neusten stand sein.
bei den neueren versionen stehen dir nur mehr funktionen zurverfügung (dh. wenn man weiß was es gibt muss man selber meist nicht so viel selber programmieren. das macht sich aber erst bei größeren prjekten bezahlt. außer die goturn funktion, die es da gibt, mit der man ihm eine strecke in mm oder einen winkel anschlaffen kann, den er fahren soll benutzte ich öfters)
aber du kannst natürlich auch alles selber programmieren, oder einfach auf solche aufgaben noch verzichten und erst später damit anfangen.
nun zu deinem code:
mit MotorDir() kannst du bestimmen, welche drehrichtung der motor haben soll:
FWD vorwärts
RWD rückwärts
FREE leerlauf eingestellte geschwindigkeit ist egal!!!!
BREAK bremse (beide anschlüsse des motors werden kurzgeschlossen, somit blockiert er von selbst) eingestellte geschwindigkeit ist egal!!!!
mit MotorSpeed() legst du nur die geschwindigkeit fest:
es werden nur zahlen von 0 bis 255 akkzeptiert, wobei die meitsen erst ab etwa 60 losfahren
wichtig: um einen motor zu steuern braucht man immer zwei angaben (geschwindigkeit und richtung). beides bestimmt dann, wie sich der motor dreht.
in deinem beispiel bedeutet das, dass sich eigentlich kein motor drehen soll (es sind doch beide auf BREAK - also bremsen)
noch eine frage zu dienem programm, hast du danach hoffentlich auch ein while(1)?
also so:
Code:Init();
MotorDir(BREAK,BREAK);
MotorSpeed(120,120);<----- wert hier ist egal, da beide motoren bremsen
while(1); <----- damit er nicht im leeren speicher herum irrt (kann kommische aktionen verursachen, wenn man es nicht anfügt!)
Hi und Hallo,
mein erster beitrag nach 1ner woche wildem hier rumgestöbere und bisher immer ne anwort findend, hab ich nun mein erstes problem.
und zwar reagiert mein sensor einfach nicht. bei dem hex aus den 2.8 lib examples für den ir test funktioniert der sensor nur ganz knapp bevor man die hand bzw gegenstand am sensor dran hat, bei druck auf einen der taster geht reagiert er gar nicht mehr auf den gegenstand. bei ellen anderen ir programmen reagiert er auch nicht.
jemand eine idee wieso das so sein könnte?
PS: ich hab die woche auch das erste ma in C was gemacht. also ich binalles andere als ein profi ;-)
MfG
Hi little.r2d2,
wenn Du deinen Asuro testen willst, kannst Du auch AsuroFlash verwenden.
Forum Thread von AsuroFlash
AsuroFlash Webseite
In der Installation ist die Lib integriert und ein paar Demo-Projekte sind auch dabei.
Wenns installiert ist gehst Du auf Projekt öffnen
Dann wählst Du ein Projekt
Jetzt den Make all Button klicken
Bild hier
und dann den Flash-Button
Bild hier
Das sollte eigentlich alles ohne Probleme gehn.
Durchhalten!! Irgentwann gehts plötzlich......
[flash width=640 height=480 loop=false:436cb750e7]http://www.secius.com/AsuroFlash/flash/AF_BuildAndFlashDemoPrj.swf[/flash:436cb750e7]
Gruss,
O.
moin, hab den umbau auch nach der anleitung vollzogen. der code von waste hat auch funktioniert soweit. wollte jetzt noch einbinden, dass das hindernis schon früher erkannt wird und der asuro je nachdem links oder rechts daran vorbei lenkt. doch irgendwie funktioniert die ir-erkennung plötzlich so gut wie garnicht mehr. egal welche pulsweite ich einstelle, es werden nur noch stark reflektierende gegenstände unmittelbar vor meinem asuro erkannt. hab die led schon ausgetauscht, aber daran lag es nicht
Mehrere Punkte. Bei meinem Aufbau mit einer Abstandsmessung ähnlich wie IR-Schnittstelle des asuro war mir auch einmal aufgefallen, dass meine vorher saubere Messung plötzlich Fehler zeigte. Als Grund hatte ich einen in der nähe stehenden (Flach-)Bildschirm identifizieren können - hier auch mal zwei Postings runterscrollen zum Bild des Messaufbaus mit meinem asuro. Überlege, ob ähnliche, getaktete Lichtquellen bei Dir der Grund für die Fehlfunktion sein können.Zitat:
Zitat von Sir William
Als Testfahrt für die Abstandsmessung (bzw. die Sensorik zur Hinderniserkennung) mithilfe des Asuro könntest Du dies hier von Sternthaler nehmen. Dazu könntest Du Dir natürlich das ganze Posting ansehen. Zum Test einfach den Hexfile auf den asuro schaufeln und den vor die Wand stellen.
Die Abstände werden über die IR-Strecke des asuro ausgegeben, können in einem Terminalprogramm angesehen und dann auf Glaubwürdigkeit geprüft werden.Zitat:
* Bedienung
* - Den Asuro mit den Tastern zur Wand stellen und einschalten.
* - Er fährt dann ca 1,5 Meter zurueck. In dieser Zeit werden Messwerte
* gesammelt.
* - Asuro zur Datenuebertragung in Sichtweite zum PC-Empfaenger stellen.
* - Taste druecken und loslassen
* - Die Messwerte werden uebertragen.
* Mit einem weiteren Tastendruck kann die Messung wiederholt werden.
Viel Erfolg.
ok, mach ich mal gleich
danke erstmal
Also an meinem Monitor liegt es nicht. das Problem besteht auch, wenn ich ihn ausgeschaltet habe.
Ich benutze die Lib 2.71 und verstehe die Anleitung nicht so ganz
Zitat:
Hinweis
* Hinweis
* -------
DIESE ZUWEISUNG IST NUR AB DER ASURO-LIB VERSION 2.80 MOEGLICH.
Ist noch eine aeltere LIB-Version vorhanden, muss in der Funktion
SIGNAL (SIG_OVERFLOW2) in asuro.c die Funktion CirIsr() aufgerufen
werden.
- DIE LIB MUSS DANN NEU UEBERSETZT WERDEN.
- DIESE ZUWEISUNG MUSS DANN RAUS.
Schön - oder fast schade - dass es nicht an Deinem Monitor liegt.Zitat:
Zitat von Sir William
Die Anleitung bezieht sich auf die Abstandsmessung von Sternthaler. Mal langsam - und diesmal sauber auf Deine Frage abgestimmt. Dieser fertige, flashfähige Test geht davon aus, dass Deine Sensorik für die Abstandsmessung in Fahrtrichtung, gerade nach vorne ausgerichtet ist.
1) den hexfile von Sternthaler aus diesem Link downloaden und auf den asuro flashen
2) den so programmierten asuro vor eine Wand stellen - Abstandssensorik bzw. Front des asuro (=Tasterreihe) schaut zur Wand
3) asuro einschalten
4) asuro fährt ca. 1,5 m zurück und misst laufend den Abstand zur Wand
5) wenn der asuro wieder stehen bleibt, den asuro zum IR-Tranciever stellen (wie beim Programmieren)
6) Terminalprogramm am PC einschalten und auf die Baudrate des asuro eingesteen - bei mir läuft das gut mit 2400 Bd.
7) IRGENDEINEN Taster der asuro-Kollisionstaster drücken - es beginnt die Datenübertragung vom asuro zum PC. Der asuro schickt also die laufenden Messwerte von der letzten Testfahrt über die IR-Verbindung. Diese Messwerte sollten der zurückgelegten Fahrt entsprechen. Die Messmethode hat Sternthaler aufgebaut - es ist eine Mehrfachmessung, die gemittelt wird. Die Ergebnisse sind bei gleichen Hindernissen (Farbe, Struktur etc) und gleicher Beleuchtung recht gut reproduzierbar. Näheres hier.
WENN nichts übertragen wird, dann ist die die IR-Strecke (Transceiver oder asuro) defekt oder die falsche Schnittstelle eingestellt oder ? ?
Ist es jetzt klar(er) ?
ja das hab ich schon verstanden
ich meinte eigentlich das, was man in der asuro.c ändern muss, wenn man nicht die lib 2.8 verwendet?
also habs jetzt erstmal so gemacht und er zeigt folgendes an:
CKCKCKCK...
63
63
63
63
.
.
.
63
Hallo Sir,
das sieht ja nicht wirklich gut aus. Ich setzte mal voraus, dass der asuro bei der Messfahrt wirklich die 1 bis 1,5 m mit etwa 20 cm/sec zurückgefahren ist. Da der hexfile mit der zutreffenden lib compiliert wurde (bei mir ist dieser file ein Standardtest, wenn mal was zur Abstandsmessung nicht geht) müsste auch alles stimmen - WENN die hardware korrekt läuft. Die IR-Datenübertragung zum Flashen und für Daten läuft aber - wie wir sehen. Da weiß ich im Moment leider auch nicht weiter.
Also reagiert bei jeder Pulsbreite auf die gleich distanz, ca 1-3cm vor den tastern
Hm, irgendwie geht es jetzt wieder. Sehr sehr komisch. aber ich habe einen neuen Fehler. hab den folgenden code:
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
//MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
.
.
.
nun gehen sowohl die BackLED's, als auch die FrontLED in diesem Fall nur an, falls in unmittelbarer nähe ein Hindernis auftaucht. Wenn ich MotorSpeed nun aber wieder als Befehl nehme, sprich die Motoren anschmeiße, dann leuchten die LED's permanent. Es wird also immerzu ein Hindernis erkannt, auch wenn weit und breit keins in seiner Richtung ist
Was ist die förmel fur ir1, ir2, ir3 und ir4? Oder welcher wert bekommen sie am anfang? Bitte poste das ganzen program. Wir können die If regel nicht entscheiden ohne diese hinweis.
also der code von radbruch ist ja folgender:
der funktioniert bei mir ausgezeichnetCode:#include "asuro.h"
#include <stdlib.h>
int main(void)
{
unsigned char sw, speed;
unsigned char ir,ir1,ir2;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFC;
speed=140;
ir = 0;
ir1 = 0;
ir2 = 0;
ir3 = 0;
ir4 = 0;
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1){
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
} else {
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(speed,speed);
if (speed > 0) Msleep(500);
MotorDir(BREAK,RWD);
MotorSpeed(0,speed);
if (speed > 0) Msleep(500);
}
ir2=ir1; ir1=ir;
sw = PollSwitch();
/*
if (sw & 0x01)
OCR2 = 0xFE;
if (sw & 0x02)
OCR2 = 0xFD;
*/
if (sw & 0x04)
OCR2 = 0xFC;
if (sw & 0x08)
OCR2 = 0xFB;
/*
if (sw & 0x10)
OCR2 = 0xFA;
if (sw & 0x20)
OCR2 = 0xF9;
*/
}
return 0;
}
jetzt hab ich wie gesagt versucht, den etwas auszubauen, bzw abzuwandeln(sind sicher auch noch einige andere fehler drin)
ich hab erstmal den rest vom else-teil auskommentiert, um den fehlerbereich einzugrenzenCode:#include "asuro.h"
#include <stdlib.h>
int Abbiegtest();
int main(void)
{
unsigned char speed,Abbiegen;
unsigned char ir,ir1,ir2,ir3,ir4;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFE;
speed=100;
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
/*Abbiegen = 1 & rand();
if(Abbiegen == 0) // nach links lenken
{
MotorSpeed(110,130);
Msleep(300);
if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt...
{
MotorSpeed(230,100); //...eine Sekunde nach rechts lenken
Msleep(800);
}
else
continue;
}
else
{
MotorSpeed(speed,130);
Msleep(300);
if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt...
{
MotorSpeed(100,230); //...eine Sekunde nach rechts lenken
Msleep(800);
}
else
continue;
}*/
}
ir4 = ir3;
ir3 = ir2;
ir2 = ir1;
ir1 = ir;
}
return 0;
}
int Abbiegtest ()
{
unsigned char i,infr,infr1,infr2;
OCR2 = 0xDE;
infr = PIND & (1 << PD0);
for(i=1;i<=50;i++)
{
if (infr||infr1)
continue;
else
return 0; // Hindernis in der Richtung
}
infr2 = infr1;
infr1 = infr;
return 1; // kein Hindernis, Richtung kann weiterbehalten werden
}
fakt ist, lass ich in dem teilden MotorSpeed an, springt er jedes mal nach dem Anschalten in den else-teilCode:if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
Kommentier ich es aus, Fangen die LEDs erst an zu leuchten, wenn ich zb mit der Hand vor meiner IR-Abteilung rumwinke
ich verzweifel hier langsam echt mit diesem tollen gefährt...
Ich hab jetzt folgende eine Zeile, die Radbruch auch drinne hatte, mitreingenommen, und plötzlich funktioniert es: sw = PollSwitch(); !!!! Kann mir das einer erklären?
also lediglich der Variablen "sw" den Wert der Taster zugewiesen mit "sw = PollSwitch();"Code:while(1)
{
sw = PollSwitch(); // <-------------------------------- HIER
ir=PIND & (1 << PD0);
if (ir || ir1) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
MotorSpeed(150,0);
Msleep(1000);
}
Hallo
Ich glaube nicht, dass PollSwitch() selbst diesen Effekt auslöst. Vielmehr scheint mir eine fehlende Verzögerung in der Hauptschleife in Verbindung mit IR-Störungen durch Fremdlicht (Leuchtstoff, Halogen, LCDs, CRTs..) die Ursache zu sein. Wenn solch ein verirrtes IR-Teilchen den Empfänger irritiert und er seinen Ausgang auf Low setzt, werden die IRx quasi in einem Rutsch eingelesen. Mit PollSwitch() wird das Einlesen der IRx aber durch ein paar zusätzliche Sleep()s verzögert. (ein Sleep() ist ein Takt Trägerfrequenz, der TSOP benötigt ca. 6-10 Takte der Trägerfrequenz für die Erkennung)
Ersetze mal in deinem Progamm sw=PollSwitch(); durch ein schlichtes Sleep(20);
Die Funktion PollSwitch() aus der asuro-LibraryCode:/* function to read out switches */
unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak=autoencode;
autoencode=FALSE;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8);
SWITCH_OFF;
Sleep(5);
autoencode=ec_bak;
//return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
}
Und noch die switches-Defines aus asuro.h dazu:
#define SWITCHES (1 << PD3)
#define SWITCH_ON PORTD |= SWITCHES
#define SWITCH_OFF PORTD &= ~SWITCHES
Gruß
mic