Hi ,

Ik weet niet of dit in de juiste categorie staat 'school' , maar ik heb voor school een opdracht om een kleurdetector te maken op basis van en picdem18f , mijn kleur registratie werkt perfect het probleem dat ik heb is dat de kleur ook moet uitgesproken worden door een speaker .

ik heb als gedachte een binaire waarde van rood te stockeren en er een rotate left functie op toe te passen.

#define RCNT 0x20
#define MYREG 0x21
#define F
#define C

BCF TRISB,1
MOVLW 0x41
MOVWF MYREG
BCF STATUS,C
MOVLW 0x8
MOVWF RCNT
BSF PORTB,1
AGAIN RLCF MYREG,F
BNC OVER
BSF PORTB,1
BRA NEXT
OVER BCF PORTB,1
NEXT DECF RCNT,0
BNZ AGAIN
BSF PORTB,1

dit zou steeds de geroteerde bit naar portb moeten sturen volgens mij , echter werkt dit niet ik krijg steeds syntax error op AGAIN , OVER en NEXT. Als ik deze eruit haal krijg ik ook een syntax error op MOVLW 0x8 .

Of dit een goeie gedachte is qwa uitwerking weet ik niet 100%, heb ook gedacht aan een audio sample in de EEPROM/flash te stockeren en deze naar de speaker te sturen, maar hierover vindt ik echter weinig info qwa uitwerking.

dubbele punt gebruiken voor labels werkt beter ;-)

fripster

edit: even een code snippet:

;---- initilisiation ---- 
start:
		call 	InitAll			;initialize all PIC global settings
		call 	LCDInit			;initialize LCD
		call    ActivateInt		;activate the interrupts
;---- main program ----	
mainlp:
		btfsc	MYSTAT,LCD_RDY	;check whether a complete message was received
		call	stringin
		goto	mainlp

;---- string parsing and showing routines go here ----
stringin:
		bcf		MYSTAT,LCD_RDY	;reset the marker for the textout action

		movlw	0x01			;set up W to test for 0xFD = Text absolute
		subwf	LCD_DAT,W		;Subtract the first char off of the W, put back in W
		btfsc	STATUS,Z		;if z=1 then previous instruction yielded a zero.
		goto	dotextabs	

[Bericht gewijzigd door fripster op (85%)]

Dubbele punten zijn vrijblijvend, werkt zonder ook prima. (maar wel goed voor de duidelijkheid...)
Er zal wel iets anders mis zijn als er een syntax error op 'movlw 0x8' komt, want dat moet gewoon kunnen.

Misschien kun je de complete code laten zien, en de eventuele errors...
Eenvoudige telefoonkwaliteit speech kun je opslaan in flash als 8 bit/8 kHz PCM, en die uitsturen via PWM.

complete code :



#include <p18f4550.h>  

/** V E C T O R  R E M A P P I N G *******************************************/

extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x001000
void _reset (void)
{
    _asm goto _startup _endasm
}
#pragma code
void ISR (void);
#pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
void _high_ISR (void)
{
      _asm goto ISR _endasm
}

#pragma code _LOW_INTERRUPT_VECTOR = 0x001018
void _low_ISR (void)
{
    ;
}
#pragma code
/******************************************************************************/


unsigned int rood = 1206420333240;

void main (void)
{	

	TRISD = 0x00;           	// PORTD  als uitgang
	TRISB = 0b00110000;    		// RB4 en RB5 als ingang
    TRISA = 0x00;				// RA output
		
	RCONbits.IPEN = 0; 			// prioriteit uit
	INTCONbits.GIE = 1; 		// enable interrupt
	INTCONbits.RBIE = 1;		// interrupt portB aan
	
	while(1)
	{	
		_asm sleep _endasm	
	}
}

#pragma interrupt ISR
void ISR (void)
{
	

	if (INTCONbits.RBIF==1)
	{
		if(PORTBbits.RB5==0) 
		{
					_asm
						#define RCNT 0x20
						#define MYREG 0x21	
						#define F
						#define C					
			
						BCF TRISB,1
						MOVLW 0x41
						MOVWF MYREG
						BCF STATUS,C
						MOVLW 0x8
						MOVWF RCNT
						BSF PORTB,1
					AGAIN RLCF MYREG,F
						BNC OVER
						BSF PORTB,1
						BRA NEXT
						OVER BCF PORTB,1
					NEXT DECF RCNT,0
						BNZ AGAIN
						BSF PORTB,1
					_endasm
		}
		
	}	
	INTCONbits.RBIF = 0;
}


wat wel kan is dat het aan de compiler ligt , werk met een c18 compiler.
In de code staat rood met de decimale waarde daar zou uiteindelijk via rotate de bit die in de carry komt naar de luidspreker te sturen PORTB en zo bit per bit van rood.

Ah,

Nu is het plotseling C geworden. ;) Opmerking over dubbele punten geldt voor assembly...

Op 23 mei 2011 22:13:25 schreef Arco:
Eenvoudige telefoonkwaliteit speech kun je opslaan in flash als 8 bit/8 kHz PCM, en die uitsturen via PWM.

Je kunt ook speech opslaan als 8-bit 44.1kHz WAV op een SD-kaartje, geheugenchip of iets dergelijks. Die laten zich allemaal wel makkelijk uitlezen, en een SD-kaart is al helemaal simpel bij te werken. 44.1kHz maakt het ook wat prettiger luisteren. Uitsturen met PWM moet prima werken.

TS wilde e.e.a. in de flash van de PIC opslaan.
Met 44kHz ben je dan snel door je beschikbare bytes heen... ;)

@ Arco , wat bedoel je prcs met dubbele punten.

Over dat SD kaartje hoe dit aan te sluiten op een PICDEMFS USB Demo Board ?
En zou er eventueel wat informatie of code voorbeelden kunnen gedeeld worden of links met informatie over die "flash als 8 bit/8 kHz PCM, en die uitsturen via PWM."

@ Arco , wat bedoel je prcs met dubbele punten.

Zie posten boven. We konden niet 'ruiken' dat je met C bezig was ipv. assembly...

SD kaartje kun je op de SPI poort van de pic aansluiten.
Spraak kun je als file gewoon op een PC opnemen als raw PCM, 8 bit mono, de data uit die file in het pic geheugen zetten, en uitsturen via de PWM output. (Er moet wel een filtertje achter de PWM output om de scherpe randjes van het PWM signaal af te bijten...)

een gewoon RC filter neem ik aan ?

Ow en dit is allemaal mogelijk rechtsreeks in C of moet ik met assambler werken tussen de _asm endasm_ ?

[Bericht gewijzigd door Henry S. op (61%)]

Dat kan gerust in C, vermits je alle registers goed instelt (interrupts dus). Ik heb het ook in C-code draaiend gekregen op mijn Arduino-kloon.

Als je een goedkoop spraak speakertje aanstuurt, is een RC inderdaad genoeg.
De speaker zelf filter de rest er uit, omdat 'ie hoge tonen niet kan weergeven.

Ok bedankt alvast voor de reacties. Dat aansluiten van die SD kaart snap ik wel niet goed hoe dat mogelijk gaat zijn :s

Het is een schoolvraag, dus je mag zelf wel even wat opzoeken. Om het je makkelijk te maken, je zou naar wat kernwoorden kunnen zoeken in de posts van Arco en mij. Dan vind je bijvoorbeeld SPI, SD, PIC. Probeer die termen eens in Google in te voeren. En kijk dan of je het nog steeds niet snapt.

We gaan hier niet alles voorkauwen!