beste leden,
een PC stuurt een telegram naar mijn micorcontroller die de telegram splitst en de jusite data eruit haald. nu zit ik alleen met een probleem want die telegram is bijna 300 tekens lang. deze telegram word in 1 keer verzonden. nu haal ik die telegram binnen via de instructie: {5,Timeout_UART},STR Buffer \256. maar ik kan mijn array niet groter maken als 256 byte elementen want dan geeft picbasic een error. Hoe kan ik die data in 1 keer netjes ontvangen en wegzetten en me PIC?? ik maak gebruik van een pic 18f452 die draaid op 20 Mhz. Ik heb al geprobeerd met een hardware interrupt de tekens 1 voor 1 uit het UART buffer te halen en te splitsen 2 arrays maar dat werkt niet omdat me programma te lang bezig is met het verwerken en dan loopt me UART buffer vol.
alvast bedankt
Wat voor error geeft picbasic dan?
En wat is de baudrate waarop je communiceert? Die moet wel heel hoog zijn wil het programma te langzaam zijn om je data over meerdere array's te verdelen.
picbasic geeft een melding dat een byte array van meer als 256 bytes niet toegstaan is. baudrate is 115200 ik zal eens proberen 2 x achter elkaar {5,Timeout_UART},STR Buffer \256 te zetten met een andere array maar ik dacht me te herinderen dat de instructie HRSIN blijft wachten tot het buffer leeg is en dan verder gaat maar anders zou ik het niet weten
bedankt voor je ractie
[Bericht gewijzigd door Henry S. op (28%)]
nee opslaan is niet noodzakkelijk want ik gebruik maar net 40% van de data die er instaan en de rest is eigelijk voor de microtrontroller niet van belang dus dat kan weg gegooid worden
[Bericht gewijzigd door Henry S. op (33%)]
het is al lang geleden, maar is het je nog gelukt?
Ik wil namelijk ook een telegram (van een electriciteitsmeter) via mijn ATmega naar een grafische lcd displayen. Lukt me wel om characters naar mijn PC te echo-en voor test, maar ik heb moeite met hele telegrammen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
In assembly is dat goed te doen..in picbasic loop je al snel tegen de grenzen aan. Accepteert PICBasic inline assembly?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
...in picbasic loop je al snel tegen de grenzen aan.
In de lite versie wellicht... 
Testen van registers duurt niet veel langer als in assembly, moet goed kunnen.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
In compilers voor 8bit processoren die vroeger niet meer dan 8bits aan RAM-adresruimte hadden en tegenwoordig zelden meer dan 1k, kan ik me goed voorstellen dat "snelheid" opweegt tegen "mogelijkheid tot grote arrays gebruiken". Kortom, ik kan me goed voorstellen dat de array-implementatie van de compiler een 8-bit index gebruikt of zelfs een 8-bit offset. (in het ene geval kan je wel een 200-element array van 16-bits dingen maken, in het tweede geval niet).
Op 16 mei 2016 17:56:35 schreef Arco:
Zoals gezegd, de data na iedere ontvangen byte verwerken...
Na wat zoeken kwam ik deze tutorial tegen (in het duits):
https://www.youtube.com/watch?v=hCCGMMyTtK4
Ik heb zijn code aangepast om te werken met mijn hardware setup (atmega328p met 18,342 MHz crystal oscillator) en dat de data wordt verstuurd als er een uitroepteken komt (0x21). Ik gebruik PuTTY. Probleem is als ik op uitroepteken druk receive ik niets?
#define F_CPU 18432000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void uart_init()
{
UCSR0B |= (1 << TXEN0) | [b](1 << RXEN0)[/b]; //Enable Transmitter
UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); //8 bit data
UBRR0L = BAUD_PRESCALE;
UBRR0H = (BAUD_PRESCALE >> 8);
}
void uart_outputchar(char ch)
{
while(!(UCSR0A &(1<<UDRE0)))
;
UDR0 = ch;
}
void uart_output(char *calledstring)
{
for (int i=0; i<255; i++)
{
if (calledstring[i] != 0)
{
uart_outputchar(calledstring[i]);
}
else
{
break;
}
}
}
char uart_getnew()
{
while(!(UCSR0A & (1<<RXC0)))
;
return UDR0;
}
void uart_readnew(char *calledstring)
{
char ch;
int cntr = 0;
while (1)
{
ch = uart_getnew();
if (ch == 33) // Exclamation mark "!"
{
calledstring[cntr] = 0;
return;
}
else
{
calledstring[cntr] = ch;
cntr++;
}
}
}
int main(void)
{
char INPUT[255];
uart_init();
while(1)
{
uart_readnew(INPUT);
uart_output(INPUT);
uart_output("\r\n");
}
}Heb ik ergens iets fouts gedaan?
EDIT: fout gevonden, ik ben RXEN0 vergeten erin te zetten
, nu werkt het wel