Enkel A/D omvandling strular
Re: Enkel ad omvandling strular
Jag använder MikroC också (ibland) och där hör det till att initiera ganska som vanligt!
Ska man använda portarna ska de initieras som vanligt.
Ska man använda AD-omvandlaren ska den initieras som vanligt.
Ska man använda UART'en ska den initieras som vanligt.
Ska man använda AD-omvandlaren ska den initieras som vanligt.
MikroC är INTE magisk i den hänseende!
Att det sedan kan finnas färdiga initieringsrutiner är bara kul men de ska ju användas också och dom får man som användare/programmör faktisk lägga in i programmet!
Ska man använda portarna ska de initieras som vanligt.
Ska man använda AD-omvandlaren ska den initieras som vanligt.
Ska man använda UART'en ska den initieras som vanligt.
Ska man använda AD-omvandlaren ska den initieras som vanligt.
MikroC är INTE magisk i den hänseende!
Att det sedan kan finnas färdiga initieringsrutiner är bara kul men de ska ju användas också och dom får man som användare/programmör faktisk lägga in i programmet!
Re: Enkel ad omvandling strular
Ska försöka hinna kolla ikväll på databladet.
Men jag tycker ändå att det är jäkligt skumt att jag har ett fullt fungerande program/krets om jag inte ens initialiserat adcn
Men jag tycker ändå att det är jäkligt skumt att jag har ett fullt fungerande program/krets om jag inte ens initialiserat adcn
Re: Enkel ad omvandling strular
Jag ser INGENSTANS att du rent faktisk har verifierat att de värden du får från read_adc() stämmer med ingångsvärdet. Du antar att det borde fungera men du vet inte om det verkligen gör det.
"Assumption is the mother of fuck-up's!"
"Assumption is the mother of fuck-up's!"
- Klas-Kenny
- Inlägg: 11843
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Enkel ad omvandling strular
Något jag funderar på är om du verifierat att programmet över huvud taget exekveras?
Kan ju mycket väl vara något strul med MCLR eller liknande.
Kan ju mycket väl vara något strul med MCLR eller liknande.
Re: Enkel ad omvandling strular
Programmet körs. Jag har provat innan att bara toggla out med 1hz och det funkar.
Har även på ren måfå vänt tecknet i if satsen adc > .....
Då blev out=0 sedan kom fördröjning och sedan blev den ett och förblev ett
Har även på ren måfå vänt tecknet i if satsen adc > .....
Då blev out=0 sedan kom fördröjning och sedan blev den ett och förblev ett
Re: Enkel ad omvandling strular
@icecap.
Vet inte riktigt hur jag ska verifiera det i nya programmet.
I det gamla är det väl verifierat med en komplett krets, men du kanske menar på ngt annat sätt?
Vet inte riktigt hur jag ska verifiera det i nya programmet.
I det gamla är det väl verifierat med en komplett krets, men du kanske menar på ngt annat sätt?
- SeniorLemuren
- Inlägg: 8432
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Enkel ad omvandling strular
Har du kollat om du får något värde överhuvudtaget i ADRESH, ADRESL som ändras med pålagd spänning.
Jag brukar kolla med att sätta flera olika större/ mindre än för att ringa in värden och se om det händer något. Det kan ju vara som Icecap är inne på att du får värden men att de inte är vad du tror.
Jag brukar kolla med att sätta flera olika större/ mindre än för att ringa in värden och se om det händer något. Det kan ju vara som Icecap är inne på att du får värden men att de inte är vad du tror.
Re: Enkel ad omvandling strular
Detta är just en av anledningarna till att antingen aktivera en serieport eller ha en ICD eller PICKit!
Med serieporten kan man skriva ut det uppmätta värde och se att det ändrar sig med potentiometern man lekar med.
Samma sak med ICD/PICKit: kör ett varv och se att AD-värdet är "konstant". Sedan vrider man på pot'en så att ingångsspänningen ändras och man kör ett par varv mer och ser att värdet är stabilt på det nya värde.
Senast fick jag fixa en paniklösning då jag inte fick UART'en att fungera: bit-bang!
Tog byten som skulle sändas, lade in i en 16-bit variabel, shiftade den ett steg åt vänster och lade sedan till 0x0600.
Sedan körde jag:
Med rätt värde på MAGIC_VALUE får man rätt bit-hastighet och med en MAX232-omvandlare av spänningen har man alltså en bit-bang UART sändare.
Då kan man enkelt skriva ut värden till en terminal/ett terminalprogram och då få ut vilket värde som läsas ut.
Med serieporten kan man skriva ut det uppmätta värde och se att det ändrar sig med potentiometern man lekar med.
Samma sak med ICD/PICKit: kör ett varv och se att AD-värdet är "konstant". Sedan vrider man på pot'en så att ingångsspänningen ändras och man kör ett par varv mer och ser att värdet är stabilt på det nya värde.
Senast fick jag fixa en paniklösning då jag inte fick UART'en att fungera: bit-bang!
Tog byten som skulle sändas, lade in i en 16-bit variabel, shiftade den ett steg åt vänster och lade sedan till 0x0600.
Sedan körde jag:
Kod: Markera allt
void Send_Byte(unsigned char Byte)
{
unsigned short Bits;
unsigned char Ctr, Dly;
Bits = (Byte << 1) + 0x0600; // Gives one startbit (0), the datas itself and two stopbits
for(Ctr = 0; Ctr < 11; Ctr++)
{
if(Bits & 0x0001) Output_Pin = 1;
else output_Pin = 0;
Bits >>= 1; // Shift and prepare next bit
for(Dly = 0; Dly < MAGIC_VALUE; Dly++); // Bit delay to get correct baudrate
}
void Send_Value(unsigned short Value) // Print out value as ASCII
{
unsigned short X, Y;
X = 10000;
while(Value >= 10)
{
Y = 0;
while(Value >= X)
{
Y++;
Value -= X;
}
Send_Byte(Y + '0'); // Send out 10k, 1k, 100's and 10's
X /= 10;
}
Send_Byte(Y + '0'); // Make sure that at least one '0' is send
}
Då kan man enkelt skriva ut värden till en terminal/ett terminalprogram och då få ut vilket värde som läsas ut.
Re: Enkel A/D omvandling strular
@newbadboy
Har du initialiserat ADCON? Satt rätt acquisition time?
Har inte micro C egen init rutin i biblioteket för A/D konvertering?
Har du initialiserat ADCON? Satt rätt acquisition time?
Har inte micro C egen init rutin i biblioteket för A/D konvertering?
Re: Enkel A/D omvandling strular
> Och fortfarande är AD-funktionen inte initialiserat! Att göra en ADC_Read() har inget med AD-initiering att göra helt enkelt!
Det vore ju bättre att RTFM först. Där står om Adc_Read:
Så så längt ser det väl OK ut.
En märklig sak är att i MikroC Pro manulen står det "Requires: Nothing"
men i en äldre MicroC manual står den en hel del under "Requires:" kring
t.ex TRIS and analog/digital konfigurering o.s.v.
En annan sak är att detta ju gäller en PIC 12F modell. De skiljer sig på en del
punkter från "vanliga" PIC 16F. Hurvida detta kan påverka just Adc_Read()
har jag inte en aning om. Om ingenting annan fungerar så kan man kolla
den ASM kom kompilatorn genererar och verifiera att det ser OK ut.
Det bör vara ganska enkelt att hitta koden som just Adc_Read() skapar
och verifiera den mot databladet.
Sen finns ju alltid möjligheten att strunta i Adc_Read() helt och köra direkt
mot rellevanta register, då kan man i princip ta exemplen direkt ur databladet
direkt, bara att skriva om från ASM till C.
Det vore ju bättre att RTFM först. Där står om Adc_Read:
Och deras eget kodexempel:Description
Initializes PIC’s internal ADC module to work with RC clock. Clock determines
the time period necessary for performing AD conversion (min 12TAD).
Parameter channel represents the channel from which the analog value is to be
acquired. Refer to the appropriate datasheet for channel-to-pin mapping.
Kod: Markera allt
unsigned int temp_res;
void main() {
ANSEL = 0x04; // Configure AN2 pin as analog
TRISA = 0xFF; // PORTA is input
ANSELH = 0; // Configure other AN pins as digital I/O
TRISC = 0x3F; // Pins RC7, RC6 are outputs
TRISB = 0; // PORTB is output
do {
temp_res = ADC_Read(2); // Get 10-bit results of AD conversion
PORTB = temp_res; // Send lower 8 bits to PORTB
PORTC = temp_res >> 2; // Send 2 most significant bits to RC7, RC6
} while(1);
}
En märklig sak är att i MikroC Pro manulen står det "Requires: Nothing"
men i en äldre MicroC manual står den en hel del under "Requires:" kring
t.ex TRIS and analog/digital konfigurering o.s.v.
En annan sak är att detta ju gäller en PIC 12F modell. De skiljer sig på en del
punkter från "vanliga" PIC 16F. Hurvida detta kan påverka just Adc_Read()
har jag inte en aning om. Om ingenting annan fungerar så kan man kolla
den ASM kom kompilatorn genererar och verifiera att det ser OK ut.
Det bör vara ganska enkelt att hitta koden som just Adc_Read() skapar
och verifiera den mot databladet.
Sen finns ju alltid möjligheten att strunta i Adc_Read() helt och köra direkt
mot rellevanta register, då kan man i princip ta exemplen direkt ur databladet
direkt, bara att skriva om från ASM till C.
Re: Enkel A/D omvandling strular
Tittade du på mitt exempel? I funktionen Init gör jag all nödvändig initiering av ADCn (samt initiering av timer 0 och övriga register som inte har ett definierat state vid påslag). I ISRen händer det bara fyra saker, varav två har med ADCn att göra. Dels är det en utläsning (sätter räknar-registret för timer 0) dels sätts GO/DONE för att starta en ny konvertering.
Jag förstår ärligt inte vad ADC_read ska vara bra för när det är lika enkelt att göra det manuellt om man har databladet öppet (vilket man har när man programmerar en MCU).
Edit: annars känns det som att det vore läge att utnyttja en komparator.
Jag förstår ärligt inte vad ADC_read ska vara bra för när det är lika enkelt att göra det manuellt om man har databladet öppet (vilket man har när man programmerar en MCU).
Edit: annars känns det som att det vore läge att utnyttja en komparator.
Re: Enkel A/D omvandling strular
Hoppas jag kan ta mig lite tid snart att kika på det mer. Min lilla ettåring drar i allt. Det verkar inte vara helt självklart detta...
Re: Enkel A/D omvandling strular
Fick igår en kort stund över och hann titta lite på det. Det verkar som om det är HW problem och inte i koden.
Kopplingen jag har är en nedan länk
http://www.ladda-upp.se/bilder/etkxcfshzlheza/
Jag mäter spännings fallet över 0,2ohms motståndet med ad'n i vanliga fall när det inte funkar. Provade istället att mäta över en pott och då funkade det. Skulle nästan tro att DC motorn ger så mycket skit ifrån sig att adc'n ballar ur.
Kopplingen jag har är en nedan länk
http://www.ladda-upp.se/bilder/etkxcfshzlheza/
Jag mäter spännings fallet över 0,2ohms motståndet med ad'n i vanliga fall när det inte funkar. Provade istället att mäta över en pott och då funkade det. Skulle nästan tro att DC motorn ger så mycket skit ifrån sig att adc'n ballar ur.
Re: Enkel A/D omvandling strular
Men herregud... du måste ju ha något filter mellan mätmotståndet ocn µC-ingången! Ett seriemotstånd på kanske 4,7k (gärna mer!) och en kondensator mellan pinnen och GND, värde på 10nF eller (gärna) mer.
Senast redigerad av Icecap 16 maj 2013, 09:09:30, redigerad totalt 1 gång.
Re: Enkel A/D omvandling strular
newbadboy: du får gärna ladda upp bilder direkt till forumets egna bildserver, istället för till externa bilduppladdningstjänster. Inte nog med att det är mer framtidssäkert (dvs bilderna försvinner inte ur trådar i framtiden när de externa tjänsterna rensar eller läggs ned), dessutom går det i 9 fall av 10 snabbare (både att ladda upp bilden samt att kolla på bilden). Dessutom verkar externa bilduppladdningstjänster inte fungera bra med TapaTalk (app för att läsa forum på smartphones). 
