Ik heb een dom probleem met een programma.
Ik probeer een SRF005 uit te lezen door middel van een PIC18f4550.
(een Dwengo-pakket)
Op de scoop kan ik zien dat het werkt, maar ik kan in mijn programma de poort niet uitlezen. Hij steekt in A0 en die kan O/I zijn.

Zou iemand me kunnen helpen?
Hieronder het programma. mijn probleem zit op line 27.

#include <dwengoConfig.h>
#include <dwengoBoard.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoADC.h>

int m; 
double time,distance,dis;

void main(void)
{
 initBoard();
 initADC(); 
 initLCD();
 clearLCD();
 backlightOn();
 setCursorLCD(0,0);
 appendStringToLCD("afstand:");
 while(TRUE)
 {
  LEDS = 0b10000000;  
  delay_us(10);
  LEDS = 0b00000000;  
  delay_us(100);
  m=0;

  while(TRISAbits.TRISA0==1)
  {
  m++;
 setCursorLCD(1,0);
 appendIntToLCD(m);
  }
 time=(0.0000004*m); //Calculating the time based on the insturction cyle of the pick by multiplying the count to it 
 dis=(time*34000); //Caluclating the distance based on time. The signal travles 34000 cm in a second 
 setCursorLCD(1,0);
 appendIntToLCD(m);
}
}

mvg,
Boen

Weinig ervaring met PIC. Misschien moet je de poort op input zetten?

Je ingangen zitten niet op trisa, maar op porta.
De tris bits veranderen niet nadat je ze gezet hebt.

Verder kan ik er weinig van maken, ik ken je bord niet, je includes / libraries zijn mij onbekend.

Bedankt voor de reactie.

Ik zou niet weten hoe.
Ik kan er zelf ook niet veel van, maar ik kan niet terugvinden hoe ik dat aan de PIC moet duidelijk maken.

http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf
op p 13 staat voor pin 2, die in A0 noemde, digitaal of analoog genoemd kan worden. maar als ze digitaal is, staat er bij dat ze I/O is...
dus, daar zit ik vast...

Ja, daar heb je gelijk. mijn fout. Dat TRIS gedoe was van het testen.
Wil ik de 5 h bestanden doorsturen?

mvg,
Boen

de h bestanden hebben niet zoveel zin, daar staan alleen declaraties in. Om welk bord en welke compiler gaat het?

Het gaat hier fout:


TRISAbits.TRISA0 == 1

Je wilt controleren of porta.0 hoog is. Wat je doet is het volgende:

1. Aan het begin van het programma maak je de poort tot een ingang


Alles uitgang behalve porta.0
TRISA = 0b00000001;

als je alleen porta.0 wil veranderen en de rest wil laten wat het was doe je het volgende:

TRISA = (TRISA & 0b11111110) | 0b00000001;

2. De poort uitlezen


if (PORTA & 0b00000001){
 doe iets;
}

Verder ben ik ook erg benieuwd wat dit doet:


LEDS = 0b10000000;

Waar verwijst dat LEDS naar? Deze verwijzing staat waarschijnlijk in de includes. Ik denk dat je daar een puls mee probeert te geven, klopt dat?

edit:

ik heb het even uitgezocht, het gaat hier om de microchip mcc18 compiler met wat extra header files. In deze header files worden de fuses ingesteld en worden er een zwik defines gedaan. Waaronder dus ook deze "LEDS" wat stiekem gewoon PORTD is.

[Bericht gewijzigd door pientertje op (13%)]

in stappen:
- bepalen welke pin van welke poort input of output moet zijn
- bijbehorende TRISx bit op 1 (input) danwel 0 (output) zetten
- als een poort/bit dat je als input wilt gebruiken zowel digitaal als analoog kan zijn bepalen wat je wilt hebben
- opzoeken in de datasheet hoe je er voor zorgt dat die poort analoog danwel digitaal moet worden geschakeld

oh ja, ook een beter onderwerp aan je topic meegeven, dit slaat nergens op

die ledjes zijn de D poorten en die geven de nodige pulsen naar de sensor.

even checken of ik het juist begrijp,
TRISA=0b00000001 maakt A0 tot een digitale input ingang

al bedankt voor de reacties.

mvg,
Boen

Op 19 juli 2011 17:28:45 schreef hadv:
in stappen:
- bepalen welke pin van welke poort input of output moet zijn
- bijbehorende TRISx bit op 1 (input) danwel 0 (output) zetten
- als een poort/bit dat je als input wilt gebruiken zowel digitaal als analoog kan zijn bepalen wat je wilt hebben
- opzoeken in de datasheet hoe je er voor zorgt dat die poort analoog danwel digitaal moet worden geschakeld

oh ja, ook een beter onderwerp aan je topic meegeven, dit slaat nergens op

Ik wil pin 2 als digitale input dus ik vermoet:


TRISA 0b00000001

en in het programma spreken over
PORTAbits.RA0

heb ik het juist zo?

en ik heb inderdaad niet nagedacht over mijn onderwerp, sorry daarvoor, maar dat komt door snel te willen zijn...

Nee, niet juist
Ten eerste moet je niet over pin nummers praten maar over port.pin. Pin 2 is niet altijd A0.
Verder heb je je nog niet verdiept in analoog en digitaal. Lees hoofdstuk 10 van de datasheet eens door.
Op jouw manier blijf je gokken en doen wij het werk.

Op 19 juli 2011 22:14:51 schreef hadv:
Nee, niet juist
Ten eerste moet je niet over pin nummers praten maar over port.pin. Pin 2 is niet altijd A0.
Verder heb je je nog niet verdiept in analoog en digitaal. Lees hoofdstuk 10 van de datasheet eens door.
Op jouw manier blijf je gokken en doen wij het werk.

Ik kan niet goed zelfstandig verder omdat ik het echt niet weet.
Je hebt gelijk met H10, ik heb het uiteraard gelezen en begrijp nu wat pientertje bedoelde met de TRIS waarden.

Ik heb het programma aangepast maar het werkt nog steeds niet...
Hij slaat de while(PORTAbits.RA0==1)-lus steeds over...

dit is wat ik heb:

#include <dwengoConfig.h>
#include <dwengoBoard.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoADC.h>

int m; 
double time,distance,dis;

void main(void)
{
 initBoard();
 initADC(); 
 initLCD();
 clearLCD();
 backlightOn();
 setCursorLCD(0,0);
 appendStringToLCD("afstand:");
TRISA = 0b11111111;
 while(TRUE)
 {
  LEDS = 0b10000000;  
  delay_us(10);
  LEDS = 0b00000000;  
  delay_us(100);
  m=0;

  while(PORTAbits.RA0==1)
  {
  m++;
  }
 time=(0.0000004*m); //Calculating the time based on the insturction cyle of the pick by multiplying the count to it 
 dis=(time*34000); //Caluclating the distance based on time. The signal travles 34000 cm in a second 
 setCursorLCD(1,0);
 appendIntToLCD(dis);
}
}

Bedankt,
Boen

PortA is (ook afhankelijk van config settings) default analoog. (Leest dan altijd als '0')
Moet je op digitaal zetten. (ADCON1 register)

[Bericht gewijzigd door Arco op (32%)]

Op 20 juli 2011 16:03:15 schreef Arco:
PortA is (ook afhankelijk van config settings) default analoog. (Leest dan altijd als '0')
Moet je op digitaal zetten. (ADCON1 register)

JA! er komen waarden op het scherm!
Ze zijn niet bepaald nauwkeurig, maar dat ligt misschien aan de berekening.
Ik ga wat testen.

#include <dwengoConfig.h>
#include <dwengoBoard.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoADC.h>
 
int m; 
double time,distance,dis;
 
void main(void)
{
 initBoard();
 initADC(); 
 initLCD();
 clearLCD();
 backlightOn();
 setCursorLCD(0,0);
 appendStringToLCD("afstand:");
TRISA = 0b11111111;
ADCON1 =0b11111111;
 while(TRUE)
 {
  LEDS = 0b10000000;  
  delay_us(10);
  LEDS = 0b00000000;  
  delay_us(100);
  m=0;
 
  while(PORTAbits.AN0==1)
  {
  m++;
  }
 time=(0.0000004*m); //Calculating the time based on the insturction cyle of the pick by multiplying the count to it 
 dis=(time*34000); //Caluclating the distance based on time. The signal travles 34000 cm in a second 
 setCursorLCD(1,0);
 appendIntToLCD(dis);
}
}

Enorm bedankt,
Boen

De datasheet is onmisbaar bij het instellen van allerlei zaken.
Bij het hoofdstuk over de I/O poorten staan ook de registers vermeld die invloed hebben op het gedrag van de poorten (zoals analoog of digitaal). En de manier waarop dat gebeurt verschilt nogal per sub-familie.
De 18F4550 is één van de meer complexe processoren, dus alleen H10 lezen is echt niet voldoende.

[offtopic]Dit is helemaal geen C++, dit is C. C++ staat gekend om zijn Object georienteerd programmeren, waar jij hier niet aan doet! Is ook overkill voor een PIC[/offtopic]