C++ laserquest

Status
Niet open voor verdere reacties.
Ik zou beginnen door een sensor aan de microcontroller te knopen die licht detecteerd. Laten we het niet te moelijk maken door het licht nu al te gaan pulseren met een ID-code, maar gewoon: licht.
dit zou je bijvoorbeeld kunnen doen met een LDR of beter: een photodiode
 
stk500

Beste Niek,

ik zit een beetje met het kitje te stoeien, en het bevalt me wel. Zijn er een paar websites die goede tutorials/uitleg hebben?

en ik had nog een vraagje. Ik kan een uC dus alleen in assembly of c schrijven, maar als ik een c# applicatie op mijn computer heb staan en ik verbind de computer met de uC via een rs232 dan kan ik toch alsnog communiceren tussen die 2?

bv. ik druk op de switch (ik schiet) en dan moet de LED aangaan en de Tx het doorgeven aan de pc. Dat moet ik principe toch kunnen?

bedankt
 
Beste Niek,

ik zit een beetje met het kitje te stoeien, en het bevalt me wel. Zijn er een paar websites die goede tutorials/uitleg hebben?

Niet die ik zo ken , maar via google kwam ik deze site tegen en die legt wel een paar dingen aardig uit

en ik had nog een vraagje. Ik kan een uC dus alleen in assembly of c schrijven, maar als ik een c# applicatie op mijn computer heb staan en ik verbind de computer met de uC via een rs232 dan kan ik toch alsnog communiceren tussen die 2?
Absoluut! Het starterkitje heeft zelf alle hardware aan boord om dit aan te kunnen (de MAX232 oa) en je kunt dus de com-poort (die je niet gebruikt voor programmeren) gewoon verbinden met je PC als communicatiepoort.

bv. ik druk op de switch (ik schiet) en dan moet de LED aangaan en de Tx het doorgeven aan de pc. Dat moet ik principe toch kunnen?

Zeker. Je kunt dit op 2 manieren doen. In C code iets schrijven als :
Code:
DDRB = 0x00; // port b = output
DDRC = 0xFF; // port c = input

while (1){ //altijd
    if (PINC & 0x01) // eerste pin van port c
    {
         PORTB |= 0x01; // eerste LED
         //hier data communicatie
    }
    else
         PORTB = 0x00; // alles uit
    
}

Dit hierboven gaat er vanuit dat je de leds met het flatcabletje hebt verbonden hebt met Poort b en de switches met het andere cabletje met poort C.
Het kan trouwens zijn dat ik de DDR-registers precies verkeerd om heb staan, heb ff geen tijd om de datasheet door te kijken ;)

De andere (mooiere & moeilijkere) mogelijkheid zou zijn om een interrupt te genereren als er op een knop gedrukt wordt. Dit zal als gevolg hebben dat je programma, ongeacht waar hij mee bezig was, naar je knopafhandeling springt.

Maar dat is op dit moment nog eeen beetje hoog gegrepen vrees ik ;)
 
foutje

ik heb je code overgenomen in AVR Studio en ik krijg een error

hij luidt:
../LED2.c:4: error: expected indentifier or '(' before 'while'


enig idee wat daar de oorzaak van kan zijn?
 
Ik vermoed dat je dit er niet bij had staan:

Code:
#include <avr/io.h>    // header file

Mijn fout, ik had er even niet meer aan gedacht :)
 
foutje

bedankt, maar ik krijg nu nog meer fouten.

Build started 24.3.2009 at 11:21:55
avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -MD -MP -MT LED2.o -MF dep/LED2.o.d -c ../LED2.c
../LED2.c:3: error: expected identifier or '(' before 'volatile'
../LED2.c:3: error: expected ')' before '(' token
../LED2.c:4: error: expected identifier or '(' before 'volatile'
../LED2.c:4: error: expected ')' before '(' token
../LED2.c:7: error: expected identifier or '(' before 'while'
make: *** [LED2.o] Error 1
Build failed with 5 errors and 0 warnings...
 
ik zie in je compileregel: " -mmcu=atmega128"

Gebruik je ook echt een atmega128? Anders moet je je target-cpu wel even anders instellen.
Mocht dit niet helpen, kun je dan de volledige code even posten?
 
soort chip

Je hebt inderdaad gelijk, ik zie op het bord staan atmega8515L 8PU 0752. Nu heb ik geprobeert om het te veranderen. Heb op "AVR" gedrukt en het daar in een dropdown menu veranderd, maar hij blijft de atmega128 aangeven. Toen heb ik geprobeerd om een nieuw project op de zetten. Daar kon ik dan weer nergens de atmega8515 aanklikken.

keek onder project settings -> en daar heb ik de chip kunnen veranderen, maar de errors blijven hetzelfde

Build started 24.3.2009 at 15:54:53
avr-gcc.exe -mmcu=atmega8515 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT LED2.o -MF dep/LED2.o.d -c ../LED2.c
../LED2.c:3: error: expected identifier or '(' before 'volatile'
../LED2.c:3: error: expected ')' before '(' token
../LED2.c:4: error: expected identifier or '(' before 'volatile'
../LED2.c:4: error: expected ')' before '(' token
../LED2.c:7: error: expected identifier or '(' before 'while'
make: *** [LED2.o] Error 1
Build failed with 5 errors and 0 warnings...



Code:
#include <avr/io.h>

DDRB = 0xFF;
DDRC = 0x00;


while (1) {

	if(PINC & 0x01)
	{
		PORTB |= 0x01;
		//data communicatie
	}
	else
		PORTB = 0x00;
}
 
Laatst bewerkt:
Aha. Je hebt dus echt nog niet zoveel ervaring met C/C++ ? Je mist namelijk een main:

Code:
#include <avr/io.h>

int main(void){       
      DDRB = 0xFF;

      DDRC = 0x00;
 
      while (1) {
          if(PINC & 0x01)
          {
              PORTB |= 0x01;
              //data communicatie
          }
          else
              PORTB = 0x00;
      }
      return 0;
}

Misschien zoiets ^^
Het kan ook zijn dat de compiler moeite heeft met mijn de typedefs en dat deze niet werken voor de atmega8515, aangezien ik deze uC nog niet gebruikt heb zou ik dat zo ook niet weten. Maar in principe zou het volgens mij gewoon moeten werken. Ik zal binnenkort mijn stk weer eens van zolder halen om wat te proberen ;)
 
Bedankt weer het is nu gelukt. Ik heb inderdaad niet veel ervaring met c.

Door de code gebeurd het volgende als ik het in de FLASH zet:
LED1 t/m LED7 zijn nu aan
LED0 is uit

als ik op Switch0 druk, gaat LED0 aan, als ik loslaat weer uit.

hoe zou ik nou bv kunnen uitlezen dat LED0 aan of uit staat. Ik zag dat je voor me al een comment had gezet met //data verkeer. Moet ik nu nog wat extras verbinden?
 
Laatst bewerkt:
De reden waarom de led nu precies verkeerd om werkt is dat deze verbonden zit aan een zogenaamde pull-up weerstand op het stk500 bordje. Dit houdt in dat wanneer het ledje uitstaat, de uitgang hoog is en wanneer de led aanstaat, de uitgang laag is.

>>hoe zou ik nou bv kunnen uitlezen dat LED0 aan of uit staat.

Dat hoef je niet uit te lezen. Ik zeg zelf in de code dat hij aan/uit moet gaan:

Code:
PORTB |= 0x01;

Voordat je verder gaat, zou ik eerst deze links lezen:

Hexadecimaal
Binairy operations

Dan begrijp je beter wat de regel doet. Je zou ook de 0x01 kunnen veranderen naar bijvoorbeel 0x03. Probeer voor jezelf eens uit te vinden waarom er gebeurd wat er gebeurd als je het veranderd
 
Beste Niek,

Ja ik begrijp inderdaad dat je dat zelf aangeeft in je code, maar ik wil dus dat het programma het naar de computer doorspeelt als er op de "schiet" knop gedrukt wordt. zodat het programma op mijn PC er iets mee doet, zoals geluid afspelen.

ps. Heb de informatie op de links doorgelezen en ik zit nu beetje te experimenteren, welke ledjes uit/aan gaan met bepaalde waardes

groeten,
Lanista
 
Beste Niek,

Ja ik begrijp inderdaad dat je dat zelf aangeeft in je code, maar ik wil dus dat het programma het naar de computer doorspeelt als er op de "schiet" knop gedrukt wordt. zodat het programma op mijn PC er iets mee doet, zoals geluid afspelen.

Op zo'n manier. Dan zou je inderdaad op de plek die ik aangegeven heb iets over de UART (com-poort) moeten sturen. De link die ik eerder al gegeven heb, gaf een voorbeeldje van die communicatie.
Op de PC kun je de verzonden data bijvoorbeeld opvangen met hyperterminal (zit standaard bij windows)

ps. Heb de informatie op de links doorgelezen en ik zit nu beetje te experimenteren, welke ledjes uit/aan gaan met bepaalde waardes

Als je het op de luie manier wil doen dan is er een truukje:
Er zijn 8 leds (dus uitgangen/pinnen per poort).
Voor iedere LED die je aan wilt hebben schrijf je een 1 op, voor iedere led die je uit wilt hebben een 0. Dus voor de buitenste 2 leds bijvoorbeeld 10000001
Start 'rekenmachine' op.
Kies beeld->wetenschappelijk
Klik op de 'bin' radio-knop (binaire)
type je code in (10000001)
klik nu op de radioknop 'hex' (hexadecimaal)
de code die tevoorschijn komt toets je weer in je programma in (in dit voorbeeld dus 0x81)
 
Beste Niek,

dat is een handig truucje, heb al wat uit mijn hoofd geleerd en het is niet moeilijk, maar je moet het weer is weten. Zou je mij even kunnen begeleiden met die Tx en Rx code?


Code:
void InitUSART (u16 baud)
{
    // Set Baud rate - Cast High byte
    UBRRH = (u8)(baud>>8);
    // Set Baud rate - Cast Low byte                       
    UBRRL = (u8)baud;                            
    // Enable Receiver & Transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);                 
    // 0 parity, 1 stop bit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);    
} 
 
From the datasheet we can get the TransmitByte and ReceiveByte routines. However, know your code.


void TxByte (u8 data)
{
   // Wait for empty transmit buffer
   while ( !( UCSRA & (1<<UDRE)) );              
   // Putting data into the buffer, forces transmission
   UDR = data;                                   
}

u8 RxByte (void)
{
   // Wait for data to be received
   while ( !(UCSRA & (1<<RXC)) );                
   // Return Data
   return UDR;                                   
}


ik snap gedeeltelijk wel waar het voor staat, maar ik moet nu toch ook die 2 pinnen RXD en TXD verbinden met een poort?
 
Dat klopt. Hier heb de datasheet van je microcontroller, dan zou je het zo op kunnen zoeken.
Hierin zie je op 1 van de eerste pagina's dat PD0 (poort D pin 0) je RXD is en PD1 je TXD. Deze moet je dus even doorlussen.
 
Ik heb nu onderstaande code zop in AVR studios gezet, maar ik krijg weer veel errors. Voornamelijk omdat "baud" en "data" undeclared zijn. Dit begrijp ik. maar ik kan zelf weer is nergens vinden wat ik dan moet doen.

Ik heb een programmatje waarmee ik de com poort van mijn computer kan uitlezen, dus dat gedeelte is al goed.

Ik heb nu alleen de RXD en TXD op de PD0 en PD1 angesloten + Sprog3 met ISPN6PIN.

Er staat onder RXD en TXD, "RS232 Spare" , betekend dat de informatie alleen door de 2de seriële poort van de stk500 gaat?

Code:
#include <avr/io.h>

int main(void){

	while(1) {

		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;                                   
		}

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

	}
	return 0;

}

de errors:

../LED2.c:10: error: expected ')' before 'baud'
../LED2.c:19: error: expected ')' before 'data'
../LED2.c:25: error: 'u8' undeclared (first use in this function)
../LED2.c:25: error: (Each undeclared identifier is reported only once
../LED2.c:25: error: for each function it appears in.)
../LED2.c:25: error: expected ';' before 'RxByte'
make: *** [LED2.o] Error 1
Build failed with 6 errors and 0 warnings...

Moet ik alle declarations weer met een hexcode defineren?
 
Laatst bewerkt:
Er staat onder RXD en TXD, "RS232 Spare" , betekend dat de informatie alleen door de 2de seriële poort van de stk500 gaat?
ja.

Ik heb nu onderstaande code zop in AVR studios gezet, maar ik krijg weer veel errors. Voornamelijk omdat "baud" en "data" undeclared zijn. Dit begrijp ik. maar ik kan zelf weer is nergens vinden wat ik dan moet doen.


Code:
#include <avr/io.h>

int main(void){

	while(1) {

		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;                                   
		}

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

	}
	return 0;

}

Ik zou je echt (echt) aanraden om eerst de basisbeginselen van C te gaan leren. Bovenstaande code lijkt echt helemaal nergens op, sorry...
Hoever staat je kennis van C? Heb je les?
Ik heb je code een beetje door elkaar gehusselt, en dan komt er dit uit: (niet getest)

Code:
#include <avr/io.h>

// onderstaande typedefs zijn standaard in de embedded wereld.
typedef unsigned char  u8;
typedef unsigned short u16;
typedef unsigned long  u32;
typedef signed   char  s8;
typedef signed   short s16;
typedef signed   long  s32;

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); // 9600 BAUD
    while (1){
        TxByte('!'); // verstuur een heleboel uitroeptekens
    }
    return 0; 
}
 
Beste Niek,

ik ben aan het beginnen met c, en ik wil je niet tot last zijn. Kun je mij een goed boek aanraden? of tuts? dan spijker ik dat bij.

Hardware is ook iets helemaal nieuws voor mij, maar vind het super interessant.

bedankt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan