[c] seriele communicatie microcontroller

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
ik wil graag wat meer leren over de seriele verbinding, en dan in combinatie met microcontrollers.
Ik heb dus een boek gedownload, waar dit goed in uitgelegd is maar helaas lijkt de code niet te werken, dat wil zeggen dat ik niets terugkrijg in hyperterminal, terwijl ik dit wel verwacht.

Dit is de code:

code:
1
2
3
4
5
6
7
8
9
void main()
{        
        Soft_Uart_Init(PORTC, 0, 1, 9600, 0);
        for(;;)
        {    
             Soft_Uart_Write("test bericht");
        }

}

(ik verwacht dus heel snel heel vaak test bericht te ontvangen)

Ik maak gebruik van een pic18f4520, die werkt op een 20mhz kristal. Ik heb uiteraard ook even geprobeerd om een led te laten knipperen om de opstelling te testen, maar dat werkt gewoon perfect.

Daarnaast lijkt de max232cpe+ die tussen de microcontroller en de computer hangt ook zijn werk te doen, want als ik R1out en T2in (die dus normaal op rc0 en rc1 zijn aangesloten) direct op elkaar aansluit krijg ik wel gewoon mijn signalen weer terug zoals verwacht. Ik heb het ook een keer geprobeerd door rb0 en rb1 te gebruiken, maar daarbij gebeurde ook niets.

Ik heb het programma geschreven in mikroC, waar ik de snelheid van het kristal ook op de juiste waarde heb ingesteld (bij de test met de led knipperde de led ook op de juiste snelheid). Ik weet niet of dit er toe doet, maar het geheel is gemaakt op een broadboard, en verbruikt volgens mijn voeding ca 0,01 tot 0,02A.

Is er iets wat ik nog over het hoofd heb gezien?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Heb je al eens geprobeerd om handmatig de juiste registers voor je RS232-verbinding te zetten, inclusief van de input/output-configuratie van de betrokken poorten? Ik heb zelf deze shorthandfuncties nooit gebruikt en had nergens problemen mee. Helaas is het dermate lang geleden dat ik een microcontroller heb aangeraakt om je verder op weg te helpen dan dat. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
ik heb de software uart maar even gelaten voor wat hij is, en de hardwarematige geprobeerd, en met de volgende code doet hij het dan perfect:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main()
{
    unsigned char MyError, Temp;
    UART1_Init(9600);
    
    for(;;)
    {
           if (UART1_Data_Ready() == 1) {
              Temp = UART1_Read();
              Temp++;
              UART1_Write(Temp);
           }
    }

}

(de code geeft dus elke keer het volge teken terug)

[ Voor 5% gewijzigd door huub8 op 10-03-2011 20:50 ]


Acties:
  • 0 Henk 'm!

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 18-05 17:57
Al eens met de oscilloscoop gekeken of de data daadwerkelijk door de controller gestuurd wordt?

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Hoe bedoel je dat precies (ik ben hier allemaal heel nieuw mee)?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gewoon een scope aansluiten op je TX/RX pinnen en kijken wat voor signaal er op staat

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Woy schreef op vrijdag 11 maart 2011 @ 16:55:
Gewoon een scope aansluiten op je TX/RX pinnen en kijken wat voor signaal er op staat
Wat voor signaal is misschien wat lastig interpreteren als hij inderdaad nieuw is met dit soort dingen, maar óf er een signaal overheen gaat is natuurlijk ook heel zinnige informatie, en da's makkelijk te zien. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op vrijdag 11 maart 2011 @ 17:32:
[...]

Wat voor signaal is misschien wat lastig interpreteren als hij inderdaad nieuw is met dit soort dingen, maar óf er een signaal overheen gaat is natuurlijk ook heel zinnige informatie, en da's makkelijk te zien. :P
Als je een beetje duurdere scope hebt, kan hij ook het signaal ook nog decoderen. Maar dat red je niet met een scope van een paar honderd euro :P

Maar het is inderdaad vooral belangrijk om te kijken of er uberhaupt een signaal op staat, en daarnaast ook op welke baud-rate het langs komt, want ook dat is met een scope redelijk eenvoudig te bepalen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
helaas heb ik ook geen scope ter beschikking. Maar is het niet al bewezen dat er een signaal langs komt doordat als ik de tx en rx pinnen doorlus ik het signaal weer terug krijg op mijn computer?

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Soft_Uart_Init(PORTC, 0, 1, 9600, 0);
UART1_Init(9600);
Ben je niet verschillende UARTS aan het testen? PORTC komt overeen met UART1?
helaas heb ik ook geen scope ter beschikking. Maar is het niet al bewezen dat er een signaal langs komt doordat als ik de tx en rx pinnen doorlus ik het signaal weer terug krijg op mijn computer?
Je bedoelt je 'hardwarematige' implementatie? Niet noodzakelijk. Wanneer om wat voor reden dan ook de baudrate of handshake niet zou kloppen, kan het zijn dat Hyperterminal niets laat zien, terwijl een scoop wel signaal weergeeft.

Je zou trouwens in je for(;;) lus ook het ledje kunnen laten omflippen, zodat je kunt zien of de software niet hangt in Soft_Uart_Write(). Mogelijk moet je dan wel je testbericht langer maken, of de baudrate verlagen. Bij deze opstelling zou het ledje elke 12 msec omvallen, oftewel een periode van 24 msec, oftewel +/-40Hz. Dat zie je niet zonder scoop. Op 1200 baud zou het +/-5Hz moeten zijn.
Pagina: 1