Hallo leute!
ich will mit einem pic16f877 einen servoposition per pc steuern und auch
einen(bzw später mehrere Analogwerte) einlesen!
bei meiner steuerung funktioniert die servo ansteuerung schon sehr gut!
jetzt möchte ich dazu einen analogwert einlesen! ich habe dazu eine
interrupt routine programmiert aber irgendwie wird diese isr nicht
ausgeführt! könnte mir da jemand vielleicht helfen???
hier mal der gesamte programmcode!
messwert=ad_wert/1023.0*5;// AD Wert 0-5V; Betriebsspannung
40
printf("\fADWert: %1.4f\n",messwert);
41
42
}
43
44
voidmain(void)
45
{
46
charempfangen;
47
48
49
setup_timer_2(T2_DIV_BY_4,125,1);
50
set_timer2(0);
51
52
setup_adc(ADC_CLOCK_INTERNAL);
53
setup_adc_ports(ALL_ANALOG);
54
set_adc_channel(0);
55
enable_interrupts(INT_TIMER2);
56
enable_interrupts(INT_AD);
57
enable_interrupts(GLOBAL);
58
59
while(true)
60
{
61
//************************************
62
if(kbhit())
63
empfangen=getc();
64
pos=empfangen-60;
65
//************************************
66
67
}
68
}
ich habe aus dem CCSC manuel die interrupt auslösung #INT_AD gefunden!
und in die beschreibung dazu: "Analog to digital conversion complete"
wann löst der interrupt jetzt eigentlich aus?
ich habe mir dass so gedacht, wenn die a/d wandlung fertig ist wird ein
interrupt ausgelöst! oder??
warum wird dann mein interrupt nie ausgelöst??
hoffe mir kann jemand helfen! danke schon im voraus!
mfg
Ok.
1) Shift-Taste benutzen. Groß-/Kleinschreiberegeln aus der Grundschule
wiederholen.
2) Sätze enden im Deutschen mit einem Punkt ("."). Wann man Ausrufe-
oder Fragezeichen verwendet, hat man dort ebenfalls gelernt.
3) Ich vermute du brauchst in dem ISR-Handler
@Timmo: Nein ich muss den ADC nicht extra aktivieren. Das Aktivieren
erfolgt mit den befehlen :
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
@Ernst Bachmann: Ich habe jetzt das Programm mit den von dir
vorgeschlagenen Befehlen ergänzt. Doch leider ist das Ergebnis immer
noch nicht, dass was ich will.
Der AD Wert wird jetzt zwar richtig eingelesen, aber immer nur dann wenn
ich ein Zeichen vom PC zu meinem PIC sende.
Ich möchte aber, dass der aktuelle AD Wert zu meinem PC gesendet wird,
ohne dabei ein Zeichen senden zu müssen.
Danke schon im Voraus!
mfg dewey
Hallo,
Leider habe ich das Problem noch nicht lösen können.
Das Problem:
Der AD Wert wird jetzt zwar richtig eingelesen, aber immer nur dann wenn
ich ein Zeichen vom PC zu meinem PIC sende.
Ich möchte aber, dass der aktuelle AD Wert zu meinem PC gesendet wird,
ohne dabei ein Zeichen senden zu müssen.
Hier mal de aktuelle Code. Bin schon langsam am verzweifeln!
kein printf keine Division und kein float in einer INT Fkt...
Das macht man einfach nicht...( siehe auch dazu ander beiträge von uns
beiden)
in der isr nur den ad_wert holen und dann mit einer var. dem main
mitteilen das da was neues gibt...
Hallo
Du startest bei jedem Durchgang des Mainloops die AD-Wandlung neu, dabei
wurde die "alte" AD-Wandlung noch gar nicht beendet. Dadurch kann die
AD-Wandlung nie beendet werden, ausser du empfängst ein Zeichen wodurch
der Mainloop etwas länger dauert (und die AD-Wandlung genügend Zeit
hat).
Starte nur eine neue AD-Wandlung, wenn die alte bereits abgeschlossen
ist.
Etwa so:
hallo,
Ich habe mit dem Befehl adc_done() ein kleines Problem!
Mein Compiler sagt, dass er diesen Befehl nicht kennt!
Liegt das an meiner Compiler Version?
Ich habe PCB version 3.187
PCM version 3.187
PCH version 3.187
Danke schon im Voraus!
mfg dewey
hallo,
Habe jetzt die Änderungen vorgenommen! Doch leider funktioniert es auch
nicht!
Die Servos kann ich problemlos steuern! Am PC wird mir nichts angezeigt!
Ich soll ja keine printfs in einer isr verwenden! jetzt ist die Frage
wie ich es sonst machen soll.
Der Code sieht jetzt folgendermaßen aus und so funktioniert es leider
auch nicht: