Forum: Digitale Signalverarbeitung / DSP / Machine Learning dsPIC4011 AD Wandler


von Matthias M. (Firma: HTBL Mössingerstraße) (motsche)


Lesenswert?

Hallo,

Ich arbeite gerade mit dem dsPIC Demoboard der Firma Microchip in 
Auftrag unserer Schule. Verwendet wird der im Betreff genannte dsPIC4011 
und der CCS-Compiler in der neuesten Version. Jetz habe ich damit 
folgende 2 Probleme:

1.: Sobald ich in meinem Programm eine Berechnung durchführe 
(Multiplikation, Dividieren etc.) mit meiner Variablen, stimmt die 
Ausgabe im HyperTerminal nicht mehr. Anstatt das im printf geschriebene 
"ADC Spannung: (Wert)" auszugeben, gibt er "AACCSSaannnn: " aus, also 
jedes ungerade Zeichen doppelt. Woran kann das liegen? Hab schon 
verschiedene Datentypen, ADC Einstellungen probiert und es wurde nicht 
besser.

2.: Der Wert im AD Wandler steht um 6 Bits zu weit links, ich muss ihn 
also mit dem ">>" Operator um 6 stellen nach rechts verschieben. Was 
kann hier die Lösung sein?

Hier noch der Quellcode des Programmes, ein Simpler AD Wandler:


#include "30F4011.h"
#include <string.h>

#fuses XT_PLL8, NOWDT, NOBROWNOUT
#use delay(clock=58982400)
#use standard_io(d)

#use rs232(baud=9600,UART2)

unsigned int16 wert;
float spannung;

void main(){

  setup_adc_ports( ALL_ANALOG );
  setup_adc( ADC_CLOCK_INTERNAL );
  set_adc_channel( 2 );


  printf("Willkommen zur Spannungsmessung!\n\r");
  delay_ms(1000);


  while(1) {

      set_adc_channel( 2 );
              delay_us(100);
    wert=read_adc();
    wert=wert>>6;
    delay_us(100);
    spannung=(wert/1023.0)*5.0;
    printf("ADC spannung:%f\n\r",wert);
    delay_ms(1000);
  }
}


Freue mich über jede Hilfe!

Liebe Grüße Matthias

von Gerhard (Gast)


Lesenswert?

Hi

dass du dein Messeregnis 6* nach rechts schieben musst, dürfte daran 
liegen, dass die PIC's, wenn ich mich recht erinnere Messergebnisse 
entweder rechts oder links bündig liefern. Du bekommts dein Ergebnis 
offenbar linksbündig.

Warum dein printf nicht funktioniert weiss ich nicht. Ich hab einmal mit 
dem C18-Compiler an einem 4013 gearbeitet, und da gab es auch mal 
Probleme mit ner Bibliotheks-Funktion, da diese Funktionen oft reichlich 
RAM brauchen. Aber dein doch kompaktes Programm sollte nicht zu viel 
davon benötigen.


Kommt sich villeicht dein delay und der UART in die Quere ? Hats du 
schon mal versucht was passiert, wenn du das delay weglässt ?

Gerhard

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Matthias Motschiunig wrote:
> #include "30F4011.h"
> #include <string.h>
>
> #fuses XT_PLL8, NOWDT, NOBROWNOUT
> #use delay(clock=58982400)
> #use standard_io(d)
>
> #use rs232(baud=9600,UART2)
>
> unsigned int16 wert;
> float spannung;
>
> void main(){
>
>   setup_adc_ports( ALL_ANALOG );
>   setup_adc( ADC_CLOCK_INTERNAL );
>   set_adc_channel( 2 );
>
>
>   printf("Willkommen zur Spannungsmessung!\n\r");
>   delay_ms(1000);
>
>
>   while(1) {
>
>       set_adc_channel( 2 );
>               delay_us(100);
>     wert=read_adc();
>     wert=wert>>6;
>     delay_us(100);
>     spannung=(wert/1023.0)*5.0;
>     printf("ADC spannung:%f\n\r",wert);
>     delay_ms(1000);
>   }
> }
>

Der Code ist ja erschreckend. Das sieht ja fast wie Bascom aus.
Da ich nicht sehen kann welche Register wie gesetzt werden, kann ich mit 
dem Code nichts anfangen.

> Ich arbeite gerade mit dem dsPIC Demoboard der Firma Microchip in
> Auftrag unserer Schule. Verwendet wird der im Betreff genannte dsPIC4011
> und der CCS-Compiler in der neuesten Version.

Warum wird nicht der kostenlose Compiler von Microchip verwendet?

Wie siehts mit Debuggern aus an der Schule? Besteht die Möglichkeit zu 
debuggen?

Gerhard wrote:
> Warum dein printf nicht funktioniert weiss ich nicht. Ich hab einmal mit
> dem C18-Compiler an einem 4013 gearbeitet, und da gab es auch mal
> Probleme mit ner Bibliotheks-Funktion, da diese Funktionen oft reichlich
> RAM brauchen. Aber dein doch kompaktes Programm sollte nicht zu viel
> davon benötigen.

Sorry, aber das ist gelogen, du hast nicht mit dem C18-Compiler an einem 
4013 gearbeitet. (Ich nehme an du meinst den 30F4013, der verlangt nach 
dem C30 Compiler)

von Gerhard (Gast)


Lesenswert?

@Willivonbienemaya

Jep, hast recht, war natürlich der C30. Weiss gar nicht wie ich auf den 
C18 komme.. :-(

Gruß
Gerhard

von Peter Diener (Gast)


Lesenswert?

Hallo,

du hast einen Fehler im Datentyp, der im printf ausgegeben wird:

unsigned int16 wert;

printf("ADC spannung:%f\n\r",wert);

wert ist kein float, deswegen geht das printf schief.
Schreib doch mal nicht wert sondern spannung in das printf, ich denke, 
so wars auch gewollt.


Grüße,

Peter

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
Noch kein Account? Hier anmelden.