PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dringend Hilfe für dsPIC30F6014 nötig!



Naty
19.10.2006, 20:44
Habe das DemoBoard 1.1 von Microchip und einen dsPIC30F6014 für mein MaturaProjekt bekommen und möchte jetzt ein LED leuchten lassen! Jedoch weis ich nicht wie ich das mache! :(
ich bin über USB mit einem MPLAB ICD2 mit dem Bord verbunden.

Ich habe versucht die Ports zu definieren und anschließend zu setzen:


#define LED1 LATDbits.LATD1
#define trisLED1 TRISDbits.TRISD1

im Hauptprogramm (MPLAB)
LED1 = 1;
trisLED1 = 0;

würde mir sehr helfen wenn mir jemand weiter helfen kann!
Später sollte ich dann mit dem 1. Button (Switch) ein LED betätigen und dem 2. das 2. LED...

lg dominik

gunzelg
22.10.2006, 17:47
Hallo Dominik

und wo ist das Problem ? Tut sich nichts ?
Wie sieht das ganze Programm aus ?

Gerhard

BMS
22.10.2006, 19:15
Hi

Kenn mich jetzt nich so gut mit dsPics aus, hab aber ne vermutung, wo dein fehler liegen könnte:

Du schaltest die LED ein(LED1 = 1;), bevor der Pin erst als Ausgang geschaltet ist (trisLED1 = 0;). Nach einem Reset schaltet der (ds)PIC nämlich alle seine I/Os als Eingänge. Eingänge kann der (ds)PIC nicht auf high oder low-pegel ziehen, die LED in dem Moment (Eingang) nicht ein/ausschalten.

vertausche doch einfach mal die zeilen

LED1 = 1;
trisLED1 = 0;

zu

trisLED1 = 0;
LED1 = 1;

-> müsste funktionieren

(
evtl. noch ein nop dazwischen weil die register nicht so schnell einlesen und reinschreiben können [äh: es handelt sich aber um PORTD / LatchD und TRISD - unterschiedliche Register - also vergiss das mit dem nop]
)

Gruss

BMS

Naty
23.10.2006, 12:57
Danke, jetzt gehts!

Habe über das wochenende viel herumprobiert und bin auf das selbe ergebnis gestoßen!
Einfach umtauschen ;)

aber jetzt hab ich ein neues Problem:

weis nicht wie ich abfrage ob ich den Taster drücke oder nicht!
weis den Ausgang als Imput zu, komm aber dann nicht weiter!!

würde mich auf eine hilfreiche Antwort freuen!!

lg dominik

gunzelg
24.10.2006, 12:45
Ein Widerstand und dein taster bilden einen Spannungsteiler. Den Widerstand legst du am anderen Ende auf 5 Volt, den taster/Schalter auf Masse. Wird der Taster nicht gedrückt, liegt am Eingang des uC ein Hgih, wird der Taster gedrückt ein low. Um das Tastenprellen in den Griff zu bekommen, kann man zum Taster parallel einen 100nF-Kondensator einbauen und in der Software eine Entprell-Routine. Z.B. fragt man solange den Eingang ab, bis der Anwender die Taste wieder losgelassen hat. Dann eine Verzögerungsroutine dazwischen, etwa 10ms, dann wieder eine Schleife, bis Sicher ist, dass der Anwender die Taste losgelassen hat. Dann wird das Programm fortgesetzt.

Gerhard

Naty
24.10.2006, 15:56
Die Taster sind ja schon am Bord!
Ich benötige nur einen Befehl wie TrisD oder so um den Schalter zu aktivieren!
Außerdem weis ich nicht ob ich ihn einfach abfragen kann ob er 1 ist oder 0!?

hmm...

lg dominik

Artur
24.10.2006, 17:24
..., komm aber dann nicht weiter!!

würde mich auf eine hilfreiche Antwort freuen!!

lg dominik

Da die Demo- / Evo-Bord's zum Teil "Komische" Befehle dazu verwenden kann ich nur Sagen - RTFM

Du hast doch auch die Docu dazu

Gruss
Artur

Naty
02.11.2006, 17:16
Nein habe leider nur das Board und die Software...
Die Bsp Programme sind auf Asembler und nutzen mir nicht viel!

Ich habe jetzt den Switch als Eingang dekleriert und weis jetzt nicht wie ich abfragen kann ob er gedrückt ist oder nicht (Taster)!
Ich glaube mit einer if schleife werde ich nicht weit kommen oder??

lg dominik

PS: Brauche Hilfe!! :)

Naty
09.11.2006, 20:32
Habe nun folgenden Quelltext:

#define LED3 LATDbits.LATD3
#define trisLED3 TRISDbits.TRISD3

#define SW1 LATAbits.LATA12
#define trisSW1 TRISAbits.TRISA12


trisLED3 = 0; //Output
LED3 = 1; //LED off
trisSW1 = 1; //Input


int n = 0;

while (n != 1)
{
if ( SW1 != 0 )
{ LED2 = 0;
n = 1;
}
}

und ich weis jetzt nicht warum sich nix tut wenn ich den taster betätige!!

kann mir wer helfen???

gunzelg
09.11.2006, 20:49
Hallo

ist der Code schon alles ?

void main( void )
{
InitPorts();

LED2 = 1;
while( 1 )
{
if( SW1 == 0 ) //Taster setzt EIngang auf 0
{
LED2 = 0;
}
}

Also, anfangs brennt die LED. wenn du jetzt den Taster drückst, sollte sie ausgehen. Die while-Schleife darfst du nicht verlassen.

Gerhard

Naty
12.11.2006, 21:10
Habe jetzt wie du gesagt hast zuerst die LED gesetzt und dann mit hilfe einer if schleife abgefragt SW == 0 aber dann leuchtet sie ja nie!!

while (1)
{
if ( SW1 == 0 )
{ LED2 = 1;
}
}

Also ich hab schon mehr Code... aber das war der wichtigste Teil:

-->ist ein Bsp. Programm von MPLAP

#include <p30fxxxx.h>
#include "LCD Display.h"
#include "common.h"

//-----von mir-------------------------
#define LED1 LATDbits.LATD1
#define trisLED1 TRISDbits.TRISD1
//------------------------------
#define LED2 LATDbits.LATD2
#define trisLED2 TRISDbits.TRISD2
#define LED3 LATDbits.LATD3
#define trisLED3 TRISDbits.TRISD3

#define SW1 LATAbits.LATA12
#define trisSW1 TRISAbits.TRISA12

//------------------------------------------
void Update_LCD( void );



int main ( void )
{
/* Initialize some general use variables */
hours, minutes, seconds = 0;
rtc_lcd_update = 0;
/* set LED0 pins as outputs */
TRISDbits.TRISD0 = 0;

//---vo mir-------------------------------------------------------
trisLED1 = 0; //Output
LED1 = 1; //LED aus
trisLED2 = 0;
LED2 = 0;
trisLED3 = 0;
LED3 = 1;
trisSW1 = 1; //Input
//---------------------------------------------------------------

/* Initialize SPI and LCD Display */
Display_Setup();
LCD_HomeClear();

/* position LCD cursor at column, row */
LCD_CharPos(0,0);
Display_String(" RTC with dsPIC30F ");
/* position LCD cursor at column, row */
LCD_CharPos(0,2);
Display_String("Time> 00 : 00 : 00 ");
/* position LCD cursor at column, row */
LCD_CharPos(0,3);
Display_String(" Nein heißt ja.. ");


/* Initialize Timer 1 for 32KHz real-time clock operation */
Init_Timer1();
/* Initialize INT1 pin used for setting Time-of-Day */
Init_INTpin();

//---vo mir----------------------------------------------------------
LED1 = 0;
LED3 = 0;

int n = 0;

while (1)
{
if ( SW1 == 0 )
{ LED2 = 1;
}
}

LED1 = 1;

//--------------------------------------------------------------------

while ( 1 ) {
if ( rtc_lcd_update )
{
Update_LCD();
rtc_lcd_update = 0;
}
};

return 0;
}

Kann das dir (euch) mehr helfen um mir eine Antort zu geben??

Es sollte sich nur der Zustand einer LED verändern wenn ich den Taster betätige und zum alten zustand wechseln wenn ich ihn wieder auslasse!

Ich glaube dass der Taster (also der wer SW1) immer von anfang an auf 0 ist und wenn ich z.B frage SW != 0 dann tut sich auch nix!!
ich weis leider nicht weiter...

Würde mich auf eine antwort freuen!!
lg dominik

Naty
13.11.2006, 19:37
Oder kann mir jemand sagen wo ich nachsehen kann um darauf zu kommen was ich noch nit richtig habe??
Brauche wirklich hilfe!

lg dominik

gunzelg
13.11.2006, 20:45
while ( SW1 == 0 )
{
LED2 = 1;
}
LED2 = 0;

Das müsste das tun.

Ich nehme mal an, dass du mit MPLAB arbeitest. Damit kannst du auch gut simulieren und schaun, was dein Programm macht. So findest du auch deine Bugs.

Gerhard