C++ laserquest

Status
Niet open voor verdere reacties.
Ik heb het zelf uit een super-verouderd boek geleerd, dus in principe maakt het niet veel uit waar je het uit leert, als je de logica maar snapt. C is in de afgelopen jaren niet veel veranderd namelijk. (op een paar dingen na die ik je niet zal melden omdat ze nog niet van toepassing zijn op dit moment)

Ik zat even op bol.com te surfen en toen kwam ik dit tegen : klik
Dat klinkt als een goed boek omdat het puur om C gaat (geen C++) en ook embedded programmeren behandeld.

Tuorials zijn overal op het web te vinden, zelf vind ik deze erg sterk: cprogramming.com

Wees gerust, je bent me niet tot last :) Het is niet vaak dat er mensen met dit soort vragen langs komen en ik vind het dus wel interessant. Zodra je me te last wordt, dan meld ik het wel :rolleyes:
 
Ja top echt bedankt!

Jij bent ook echt de enige die mij hierbij wil helpen, ik laat er geen gras over groeien en heb maar meteen het boek gekocht. Ik ga nu ook even die website, die je me gegeven hebt, doornemen.

Ik laat denk ik snel weer wat van me horen.
 
Beste Niek,

Ik probeer die code van jou samen te voegen met de vorige code, maar er gebeurt wat geks

Code:
#include <avr/io.h>
 
typedef unsigned char  u8;
typedef unsigned short u16;
typedef unsigned long  u32;

 
void InitUSART (u16 baud)
{
    UBRRH = (u8)(baud>>8);
    UBRRL = (u8)baud;                            
    UCSRB = (1<<RXEN)|(1<<TXEN);                 
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);    
} 
 
void TxByte (u8 data)
{
    while ( !( UCSRA & (1<<UDRE)) );              
    UDR = data;                                   
}
 
int main(void)
{
    InitUSART(9600);
    DDRB = 0xFF;
    DDRC = 0x00;

    while (1){

			if(PINC & 0x01)
          	{
			  TxByte("!");
              PORTB |= 0x01;
          	}
          	else
		  	{
              PORTB = 0x00;
		  	}
    }
    return 0;
}

Als ik mijn seriele poort uitlees op mijn computer krijg ik bij alles de waarde "00". En als ik de txbyte functie + portb |= 0x01 bij elkaar zet, gaat het LED'je niet meer aan. De txbyte functie doet het wel maar geeft me dus altijd dezelfde waarde...gek genoeg.
 
Tja, ik zal proberen uit te leggen waarom dit niet gek is, maar het kan misschien nog boven je niveau zijn...


Dit stukje code:
Code:
if(PINC & 0x01)
{
     TxByte("!");
     PORTB |= 0x01;
}

doet eigenlijk:
Code:
als (knop in gedrukt)
{
    roep de functie TxByte() aan met parameter '!'
    zet de led aan/uit
}

de functie die wordt aangeroepen is doet eigenlijk:
"Zolang de data niet niet geaccepteerd is, blijf hangen"

Dus zodoende zal je led nooit gaan knipperen.
Hoe heb je je com-poort op de pc ingesteld (welk programma gebruik je nu uberhaubt)
Want in principe moet je hem dus instellen op 8 databits, 0 parity, 1 stopbit en 9600 BAUD
 
Ik gebruik nu een C# .NET programma, wordt allemaal heel duidelijk uitgelegd.

http://msmvps.com/blogs/coad/archiv...32-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

Ik had hem al op de instellingen staan die jij me aangaf. maar elke keer krijgt hij 2 nullen over de seriele poort. De poort doet het wel, want als ik de rs232 kabel eruit haal, komen er geen "00" meer bij. In het programma "hyperterminal" gebeurt er helemaal niets.

moet ik de functie van de switch gewoon los koppelen?

Om een LED aan te zetten en de data te verzenden moet ik het dus anders aanpakken.
 
Laatst bewerkt:
I
Ik had hem al op de instellingen staan die jij me aangaf. maar elke keer krijgt hij 2 nullen over de seriele poort. De poort doet het wel, want als ik de rs232 kabel eruit haal, komen er geen "00" meer bij. In het programma "hyperterminal" gebeurt er helemaal niets.

Hier moet ik eerst mijn bord zelf weer voor aansluiten, voordat ik antwoord kan geven. Ik kom er later op terug

I
Om een LED aan te zetten en de data te verzenden moet ik het dus anders aanpakken.
Nee, in princpipe is de code gewoon goed, maar het versturen failed, waardoor de TX functie in een oneindige loop blijft hangen. Vandaar dat hyperterminal niets laat zien op het scherm. Wat het C# programma doet kan ik ook niet zeggen, maar ik zal het even nakijken wanneer ik wat meer tijd heb
 
Bij nader inzien zie ik trouwens al 1 grote fout in je code. Ik zei:
Code:
TxByte('!');
Maar jij schreef:
Code:
TxByte("!");
en daar zit een heel groot verschil in, in C.
 
Hier onder een (op atmega) getest programma:

Code:
#include <avr/io.h>

 
typedef unsigned char  u8;
typedef unsigned short u16;
typedef unsigned long  u32;
 
 
void InitUSART (void)
{
                           
    UCSRB  = 0x18; //init
    UBRRH  = 0x00; //high byte UBRR
    UBRRL  = 0x05; //low byte  UBBR
} 
 
void TxByte (u8 data)
{
    while ( !( UCSRA & (1<<UDRE)) ); // zolang niet verzonden, doe niets             
    UDR = data;                                   
}
 
int main(void)
{
    InitUSART();	// roep de functie InitUsart aan
    DDRB = 0xFF;	// portb is volledig ouput
    DDRC = 0x00;	// portc is volledig input
 
    while (1){		// altijd (geen einde aan programma
 
		if(PINC & 0x01)	{  // als knop 1
		        PORTB |= 0x01; // zet led
		} else {
			PORTB = 0x00; // portb uit
			TxByte('!');   // zend byte
	    }
	}
    return 0; // einde (wordt nooit bereik)
}

Ik heb mijn microcontroller lopen op een klok van 3.686 MHz en met bovenstaand programma moet je dus (kun je opzoeken in datasheet: UBRR) een BAUD-rate van 38400 gebruiken, 8 databits, 1 stopbit, geen pariteit, en geen flowcontrol.

Dit is geteste code, dus het werkt 100% zeker met hyperterminal. Ik zou het als ik jou was ook eerst daarmee proberen, om het daarná pas te proberen met je C# programma :thumb:
 
Beste Niek,

Je code werkt bij mij wel, maar hij ontvangt nog steeds "niets". In hyperterminal komt er niets binnen, maar je ziet wel dat de cursor informatie naar binnen laad. Ik zie wel dat er 1 byte wordt meegestuurd. Moet ik die converteren ofzo? om de informatie uit te lezen?

ps heb al je instellingen zelfde gedaan over de com1 poort.

bedankt
 
Zou je in AVR-studio eens kunnen kijken wat je klokfrequentie is?
Staat onder knopje AVR, en dan het tabblad 'instellingen' of iets dergelijks. Er is ergens in ieder geval een grote slider die een frequentie aangeeft.
 
Bedankt dat was de fout!
Hij loopt nu ook letterlijk 20x zo snel. Super. Zou je me kunnen uitleggen waarom die kloksnelheid uitmaakt? Is dat omdat de computer gewoon te "langzaam" is om het pakketje te ontvangen voordat er een nieuwe wordt verstuurd?
 
Laatst bewerkt:
Hij loopt nu ook letterlijk 20x zo snel. Super. Zou je me kunnen uitleggen waarom die kloksnelheid uitmaakt? Is dat omdat de computer gewoon te "langzaam" is om het pakketje te ontvangen voordat er een nieuwe wordt verstuurd?

Nou nee. De initialisatie van de uart (de InitUsart() functie) berekend de gewenste BAUD-rate aan de hand van je kloksnelheid. (dit doet hij onder de kap, dus dat zie je niet). Je baud-rate is eigenlijk je kloksnelheid gedeelt door een bepaalde waarde. Deze waarde moet je zelf bepalen, en ik was er van uit gegaan dat je op 3khz liep (of zoiets)
 
Beste Niek,

ik heb vandaag mijn light to frequency sensor binnen gekregen. Ik zou deze graag nu willen uitproberen. Kan ik zo'n sensor in de blauwe 8-pins poort steken? Wordt er gebruik gemaakt van een speciale tang of mag je ze gewoon aanpakken en erin steken?

bedankt
 
Laatst bewerkt:
Wordt er gebruik gemaakt van een speciale tang of mag je ze gewoon aanpakken en erin steken?

In principe kun je ze gewoon aanpakken, mits je statisch ontladen bent. Pak hiervoor even de aardepen van je stopcontact vast, daarna ben je ontladen.
Officieel zou je een antistatische armband of iets dergelijks om moeten hebben, maar zonder gaat het 99.999% van de gevallen ook gewoon goed en die dingen zijn erg duur.

Kan ik zo'n sensor in de blauwe 8-pins poort steken?
Dat zou fysiek mogelijk zijn inderdaad, maar heeft waarschijnlijk wel als gevolg dat ofwel de sensor door brandt, ofwel je STK500, dus ik zou het zelf niet doen nee :)

De voetjes die op je STK500 zitten zijn alleen voor microcontrollers, niet voor randapparatuur. Deze moet je zelf aansluiten met bijv een los printplaatje, of wat losse draadjes. Kun je al solderen? :p

Uit de datasheet van je sensor blijkt dat
- pin 5 = VDD (hang aan +5 volt)
- pin 4 = GND (hang aan gnd van stk)
- pin 3 = (not)OE Dit is je Ouput Enable (active low). Als deze aan de GND wordt gehangen zal de output actief worden
- pin 6 = OUT Hier wordt de frequentie naar buiten gebracht aan de hand van lichtsterkte. Deze moet je aansluiten op een ingang van de uC (waar nu het knopje aanzit bijvoorbeeld)

De volgende stap die je zult moeten ondernemen is een klok maken. De sensor output is een frequentie en deze zul je ergens mee moeten gaan vergelijken. Op de AVR-tutor site (link van een paar posts eerder) staan hier mooite voorbeelden van.
 
Beste Niek,

ok ik snap de punten die je mij nu zei! Ik heb de pinnen bekeken en de datasheet snap ik ook. Nu had ik nog een vraag. Pin 6 OUT is dus de poort die de lichtsterkte doorzend. moet ik deze dan nu in de TXD van de stk500 doen? Als dat zo is, hoe kan ik dan wel de informatie van de knoppen versturen als dat nodig zou zijn? verbind ik dan 2 poorten naar de TXD met een verloop kabeltje ?

bedankt weer
 
Nee juist niet op de txd. Allereerst:
de t in Txd staat voor Transmit, het is dus een uitgang, geen ingang.
ten tweede: de Txd wordt gebruikt voor de com-poort (en alleen de compoort). Je kunt dus een willekeurige andere pin uitzoeken, zolang het maar niet D0 of D1 is :)
 
Is het mogelijk om stroom af te tappen van de stk500? Want die loopt namelijk ook op 5V bij mij. Ik heb pin-6 nu in de PD2 poort gedaan onder de seriële PD0 en PD1. Nu moet ik dus in de microcontroller de sensor programmeren, of in ieder geval de waarde uitlezen. Die kan ik nu toch hetzelfde versturen als dat met de ledjes nu gebeurt?

ik heb nu ook de receive byte functie toegevoegd in mijn controller

Code:
u8 RxByte (void)
{
   while ( !(UCSRA & (1<<RXC)) );                
   return UDR;                                   
}

ik kan dan nu toch in de while(1) loop dit zetten:

Code:
if(UDR=="1"){ als de inkomende data 1 is
  doe dit...
}
 
Laatst bewerkt:
Is het mogelijk om stroom af te tappen van de stk500?
Ja. Niet onbeperkt natuurlijk, (denk aan de stroomlimieten) maar zo'n sensor zou geen probleem moeten zijn.
Nu moet ik dus in de microcontroller de sensor programmeren, of in ieder geval de waarde uitlezen. Die kan ik nu toch hetzelfde versturen als dat met de ledjes nu gebeurt?
Let wel op: er komt een frequentie uit je sensor, geen aan/uit waarde. Je zult deze frequentie dus uit moeten lezen. Ik weet niet of je uC een PWM-input heeft (datasheet)? Zo niet, dan moet je zelf een klok maken en de binnengekomen waarde vergelijken tegen deze klok
.
ik kan dan nu toch in de while(1) loop dit zetten:

Code:
if(UDR=="1"){ als de inkomende data 1 is
  doe dit...
}

Dat kan, maar het werkt niet :)
Allereerst: er is een verschil tussen 1, '1' en "1", namelijk: int, char en char-array. Ik ga dit verder niet uitleggen, want dit staat prima beschreven in je boek of de link die ik gegeven heb.
ten tweede:
-> u8 RxByte (void) <- is een functie, dus als je een byte wilt uitlezen zou je deze functie kunnen (/moeten) gebruiken.

Code:
u8 ingekomen_byte = 0;
while(1){
     ingekomen_byte = RxByte;
     if (ingekomen_byte == '1')
     { 
           //doe iets
     }
}
 
Beste Niek,

De communicatie voor de RXD is nu prima na wat dingetjes te hebben omgegooid. Die timer alleen zit me niet zo lekker. De website die je me had aangeraden is voor mij niet al te duidelijk met die sensor. Zou je me hierbij kunnen helpen?

Verder haal ik nu de stroom van 1 van de pinnen van de stk500 af. Maakt het uit welke ik gebruik?
 
De website die je me had aangeraden is voor mij niet al te duidelijk met die sensor. Zou je me hierbij kunnen helpen?

Vraag maar raak.

Verder haal ik nu de stroom van 1 van de pinnen van de stk500 af. Maakt het uit welke ik gebruik?

Niet echt. Er staat geloof ik iets bij van Vcc of iets dergelijks. Er zitten er een stuk of 5 op? (1 voor iedere poort). Als je 1 van die neemt gaat het wel goed.

Verder wou ik je nog aanraden om ook eens een topic te starten bij circuitsonline.nl, want je kunt nu al mijn adviezen wel overnemen, maar voor het zelfde geld heb ik mis natuurlijk. Bij circuitsonline hebben ze iets meer verstand van dit soort dingen!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan