Forum: Mikrocontroller und Digitale Elektronik Unterschied zwischen bei Compiler MPLAB® C und MPLAB® XC


von David (Gast)


Lesenswert?

Hallo Zusammen,

ich habe eine PIC18F4550, die wurde unter MPLAB IDE 8.9.2 programmiert.
Jetzt bin dabei einen neue Entwicklungsumgebung (MPLAB® X IDE v3.65) zu 
runterladden.Die Frage ist was für einen kompiler muss ich noch 
installieren
die MPLAB® C Compiler oder die MPLAB® XC Compilers?

Danke

von Pandur S. (jetztnicht)


Lesenswert?

Welchen der beiden hast du denn probiert ? Ging's nicht ?

von Volker S. (vloki)


Lesenswert?

David schrieb:
> Die Frage ist was für einen kompiler muss ich noch installieren
> die MPLAB® C Compiler oder die MPLAB® XC Compilers?

Wenn du es dir einfach machen willst, dann den, den das "alte" Projekt 
verwendet hat.

von David (Gast)


Lesenswert?

Hi,

der alten project war unter MPLAB IDE V8.9.2 und unter XP.
Wir haben dann diese in eine Virtuelle Maschine gesiedelt(vor 4 jahre).
Unter die Virtuelle Maschine zu debuggen ist echt sehr schwierig, 
deswegen bin ich dabei das Projeckt in MPLAB X IDE (V3.65) zu 
integrieren.

Was mir aufgefallen ist, dass die Library von MPLAB X anders im 
vergleich zu MPLAB 8.9.2.

z.B:
Ich brauche die USB Library aber ich finde die nicht unter MPLAB X.
Soll ich die extra runterladen?
Wenn ja Woher?

Danke

von Volker S. (vloki)


Lesenswert?

MPLABX ist eine IDE, kein Compiler und keine Bibliothek!
Das muss man dann extra installieren. Welche USB Library genau?

: Bearbeitet durch User
von E-Bastler (Gast)


Lesenswert?

David schrieb:
> Unter die Virtuelle Maschine zu debuggen ist echt sehr schwierig

Warum?

von David (Gast)



Lesenswert?

Volker S. schrieb:
> Welche USB Library genau?

Damals als der  MPLAB IDE V8.9.2 installiert wurde gaben Librarys dabei.
Ob es diese extra installiert sind, weiss ich nicht.

Da diese Librarys in Code auch includiert sein müssen "Seh bitte 
Anhang", muss ich die installieren.

von David (Gast)


Lesenswert?

E-Bastler schrieb:
> Warum?

Es ist einfach mühsam aber das problem lag nicht an der Virtuelle 
maschine selber sondern an der Entwicklungsumgebeung " MPLAB IDE 
V8.9.2".

Es macht ehrlich gesagt kein spass damit zu arbeiten.

von Gerhard M. (ggcode)


Lesenswert?

MPLAB X mit XC8

von David (Gast)


Lesenswert?

Gerhard M. schrieb:
> MPLAB X mit XC8

Ist eine grosse unterschied zwischen beide Compiler XC8 und die C18?

von Volker S. (vloki)


Lesenswert?

David schrieb:
> Damals als der  MPLAB IDE V8.9.2 installiert wurde gaben Librarys dabei.
> Ob es diese extra installiert sind, weiss ich nicht

Die sind extra installiert und es gibt zudem noch eine Menge 
unterschiedlicher Versionen, die nicht unbedingt kompatibel sind.
-> Version heraus finden...


David schrieb:
> Ist eine grosse unterschied zwischen beide Compiler XC8 und die C18?

Ja, wenn du das alte Projekt nicht komplett neu aufsetzen willst, dann 
solltest du den da verwendeten Compiler benutzen. (müsste im *.mcp File 
stehen)

von Axel S. (a-za-z0-9)


Lesenswert?

David schrieb:
> der alten project war unter MPLAB IDE V8.9.2 und unter XP.
> Wir haben dann diese in eine Virtuelle Maschine gesiedelt(vor 4 jahre).

Aha. Dann bist du also nicht nur "David", sondern auch "Saheb" vom 
Beitrag "Von Mpalb IDE Version 8.9.2 zu MPLAB X IDE"

Das gleichzeitige Eröffnen mehrerer Threads zum gleichen Thema empfinde 
ich als grob unhöflich. Die gleichzeitige Verwendung mehrerer 
verschiedener Nicks ist nicht nur unhöflich, sondern auch ein Verstoß 
gegen die Nutzungsbedingungen.

Was deine Frage angeht: MPLAB X ist nur die IDE. Die kann mit beiden 
Compilern. Auch Libraries sind nicht Bestandteil der IDE, sondern müssen 
(natürlich) extra installiert werden, sofern sie nicht bereits mit dem 
Compiler kommen.

von David (Gast)


Lesenswert?

dafür entschuldige ich mich
Sorry

von David (Gast)


Lesenswert?

Volker S. schrieb:
> Ja, wenn du das alte Projekt nicht komplett neu aufsetzen willst, dann
> solltest du den da verwendeten Compiler benutzen. (müsste im *.mcp File
> stehen)

Bei der .mcp steht folgende:
1
[Header]
2
MagicCookie={0b13fe8c-dfe0-40eb-8900-6712719559a7}
3
Version=1.0

von Volker S. (vloki)


Lesenswert?

Einige Zeilen weiter unten...
1
[HEADER]
2
magic_cookie={66E99B07-E706-4689-9E80-9B2582898A13}
3
file_version=1.0
4
device=PIC18F2550
5
[PATH_INFO]
6
BuildDirPolicy=BuildDirIsProjectDir
7
dir_src=
8
dir_bin=_output
9
dir_tmp=_output
10
dir_sin=
11
dir_inc=..
12
dir_lib=c:/eda/Microchip/mcc18/lib
13
dir_lkr=c:/eda/microchip/mcc18/lkr

Also hier mcc18 /lib >>> C18 compiler

: Bearbeitet durch User
von David (Gast)


Lesenswert?

Guten Morgen,

so mir steht auch so :
1
[HEADER]
2
magic_cookie={66E99B07-E706-4689-9E80-9B2582898A13}
3
file_version=1.0
4
device=PIC18F4550
5
[PATH_INFO]
6
BuildDirPolicy=BuildDirIsProjectDir
7
dir_src=
8
dir_bin=.\Output
9
dir_tmp=.\Objects
10
dir_sin=
11
dir_inc=C:\Microchip Solutions\Microchip\Include;C:\MCC18\h
12
dir_lib=C:\mcc18\lib

Die Frage ist: Um dieses Projekt in MPLAB X IDE zu integrien, worauf 
muss ich achten?

von Volker S. (vloki)


Lesenswert?

Du kannst versuchen das Projekt in MPLABX zu importieren, oder einfach 
mit den vorhandenen Dateien neu zu erstsellen.
Da das Projekt eine sehr frühe Version der USB Lib verwendet, würde ich 
dazu raten, weiterhin den C18 Compiler zu verwenden und auch die 
entsprechende Version der Bibliothek zu installieren, bzw. die alte 
Bibliothek einfach an den entsprechenden Ort zu kopieren.

Falls du entgegen meiner Vermutung ein erfahrener Programmierer sein 
solltest, wäre es auch möglich auf die neueste Version der Library um zu 
stellen und den User-Teil aus dem alten Projetk in das passende Beispiel 
für MPLABX und XC8 zu intergrieren.

von Volker S. (vloki)


Lesenswert?

David schrieb:
> E-Bastler schrieb:
>> Warum?
>
> Es ist einfach mühsam aber das problem lag nicht an der Virtuelle
> maschine selber sondern an der Entwicklungsumgebeung " MPLAB IDE
> V8.9.2".
>
> Es macht ehrlich gesagt kein spass damit zu arbeiten.

Viele Umsteiger behaupten übrigens, dass das Debuggen mit der alten IDE 
viel besser funktioniert hat ;-)

USB-Devices zu debuggen ist im allgemeinen etwas mühsam, weil das 
Betriebssytem (windoof X) das Device meist disconnected, wenn man es 
(beim debuggen) anhält.

von David (Gast)


Lesenswert?

@Volker SK

Was PIC betrifft bin ich wirklich neu.
Mir ist nur wichtig die Projekt unter die neue Entwcklungsumgebung im 
laufen zu bringen, ob es nachher auf XC8 integriert werden muss ist 
einen andere Frage.

Wie sieht es aus mit der Licence brauche ich eine oder?

von Volker S. (vloki)


Lesenswert?

David schrieb:
> Mir ist nur wichtig die Projekt unter die neue Entwicklungsumgebung im
> laufen zu bringen,
Sollte kein Problem sein ;-)

Lizenz brauchst du erst mal keine. Mit den Free/Light Versionen der 
Compiler kann man schon arbeiten. Professionell mit XC8 wär's 
längerfristig aber  sinnvoll.

Beim alten MCHP C18 Compiler bestand meiner Meinung nach die 
Notwendigkeit die PRO Version zu haben eigentlich nicht. Die ersten Free 
XC8 Versionen waren allerdings sehr übel. Hat sich inzwischen aber etwas 
gebessert.
http://www.microchip.com/forums/FindPost/668751

Es gibt Lizenz-Modelle, welche die XC8 PRO Version monatlich frei 
schalten. 
http://www.microchipdirect.com/ProductSearch.aspx?Keywords=SW006021-SUB

von Volker S. (vloki)


Lesenswert?

Versuch am besten zuerst das da:
http://microchipdeveloper.com/mplabx:convert-an-mplab-8-project-to-mplab-x

Wenn es dann irgendwo klemmt, kannst du immer noch manuell nachhelfen...

Nach dem ersten geglückten Compilieren archivierst du das am besten 
damit:
http://microchipdeveloper.com/mplabx:projects-package

oder gleich mit einem Version Control System.
http://microchipdeveloper.com/mplabx:version-control-working-with

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

in diesem HID Bootload.lkr weiss es nicht wofür ist die da ist und was 
macht man damit.

Wie soll ich diese umschreiben?
worauf muss ich achten?

was Pic betrifft bin wirklich neu und auf deine Hilfe freue ich mich.
10000 Danke und Sorry für die Umstände

von Volker S. (vloki)


Lesenswert?

Kommt von; http://www.microchip.com/forums/FindPost/1005969

Also generell beschreibt das Linker Skript bei den 8bit PICs für 
Assembler und den alten MCHP C18 Compiler die Aufteilung des Speichers 
(ROM und RAM).

Dazu kommt beim C18 noch die Einbindung des Startup Codes, der 
Prozessorbibliothek und die Angabe, wie groß der Stack sein soll.

Zusätzlich kann man noch "Sektions" für bestimmte Sachen in bestimmten 
Speicherbereichen anlegen und reservieren. Schau dir einfach mal das 
unverpfuschte Script ..\Microchip\mplabc18\v3.47\bin\LKR\18f4550_g.lkr 
zusammen mit dem Datasheet des 4550 an...

In "deinem" Fall wurde anscheinend ein Linker Script, welches 
ursprünglich für die Verwendung mit einem Bootloder gedacht war, 
umgeschrieben, so dass ein bestimmter Teil des Programmcodes (die 
Seriennummer des USB Gerätes?) an einer bestimmten Adresse zu liegen 
kommt um dann möglichst einfach beim Programmieren der Controller mit 
einer fortlaufenden Nummer ersetzt werden zu können.

Frag doch am besten den, der das verbockt hat nach der Dokumentation ;-)

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Frag doch am besten den, der das verbockt hat nach der Dokumentation ;-)

Wenn er hier ist.Er ist schon seit lange weg und dazu gibt es gar keine 
Documentation.

Na ja so ist halt.
Jetzt habe ich die Suppe und muss zu recht kommen.
Es wäre ganz nett, wenn du mich noch einbisschen helfen kannst.
Du hast mich ehrlich gesagt sehr viel geholfen dafür danke ich dir noch 
mal.

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Wenn er hier ist.Er ist schon seit lange weg und dazu gibt es gar keine
> Documentation.

Schon klar ;-)

Auf jeden Fall musst du herausfinden, was es mit dieser "serial" Sektion 
auf sich hat!

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Saheb/David: Entscheide Dich bitte ein für alle Mal, wer Du sein willst.

Die https://www.mikrocontroller.net/user/conditions verbieten den 
Gebrauch mehrerer "Identitäten" in einem Thread.

von Volker S. (vloki)


Lesenswert?

Rufus Τ. F. schrieb:
> Saheb/David: Entscheide Dich bitte ein für alle Mal, wer Du sein willst.

...oder melde dich einfach an, dann passiert das nicht!

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Auf jeden Fall musst du herausfinden, was es mit dieser "serial" Sektion
> auf sich hat!

Was ich weiss, dass es mit diesem Board USB Kommunikationen gibt.

zb: Commando werden von einen GUI ausgeführt, die wiederum zu den Board 
weitergeleitet werden.

Dieses Commandos werden auf die Firmware seite verschlüsselt in so einen 
Art z.B:

Von der GUI wird einen Commando z.B StromMessen:

Auf die Firmwareseite, sind dieses Commandos auch definiert:
1
#define Current_Measure             0x10
2
int main()
3
{
4
    ....
5
    case Current_Measure:
6
    {
7
       ....
8
    }
9
}

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Volker S. schrieb:
>> Auf jeden Fall musst du herausfinden, was es mit dieser "serial" Sektion
>> auf sich hat!
>
> Was ich weiss, dass es mit diesem Board USB Kommunikationen gibt.

DA wäre ich ja nie drauf gekommen ;-)

Es ist so was ähnliches, wie dieses einfache Beispiel:
http://picforum.ric323.com/viewtopic.php?f=46&t=103#p745
http://www.hs-ulm.de/nocache/wir/Personal/PersonalSaSchr/vschilli/Mikrocontroller/USBProjekte/USBHID/

Die Frage war aber eher in Richtung "Erhalten die Controller bei 
individuelle Seriennummern?"

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Beim mir das Build und Programmer funktioniert einwandfrei.
Was nicht funktioniert, ist das Debuggen

von Volker S. (vloki)


Lesenswert?

Build im debug mode funktioniert nicht!
(oder inzwischen doch)

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Build im debug mode funktioniert nicht!
> (oder inzwischen doch)

Sorry wenn ich noch blöd frage: wo sehe ich das, dass es sich im einen 
Debug version handelt?

von Volker S. (vloki)


Lesenswert?

http://microchipdeveloper.com/mplabx:main-toolbar

Bei
- Make and Program Target Project
- Debug Project
ist jedes mal Build im richtigen Modus im Hintergrund mit dabei

Bei
- Build Project
- Clean and Build Project
kann man den Mode über die DropDown Auswhl festlegen


Den Unterschied kann man hier gut erkennen:
http://microchipdeveloper.com/icd3:debug-executive
http://www.microchip.com/developmenttools/getting_started/gs_mplab4.aspx

von Volker S. (vloki)


Angehängte Dateien:

Lesenswert?

Volker S. schrieb:
> Den Unterschied kann man hier gut erkennen:
> http://microchipdeveloper.com/icd3:debug-executive

Für den 4550 sieht das übrigens so aus:
Fällt dir was auf?

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Fällt dir was auf?

Wo sehe ich das?

Sorry

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

anbei das MPLAB X IDE beim starten

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

wenn ich so mache: seh bitte Anhang

dann lauft alles Okay

von Volker S. (vloki)


Lesenswert?

Lies dir doch bitte mal die Links durch, die ich gepostet habe bevor du 
die nächste Frage stellst und versuche die Zusammenhänge zu verstehen. 
(Frag von mir aus gezielt nach, wenn du etwas aus den Links überhaupt 
nicht verstehst)

Dabei sollte dir eigentlich klar werden, dass in deinem Projekt keine 
Sektion definiert sein darf, die sich mit den Debug Resourcen 
überschneidet, wenn debuggen möglich sein soll!

Da das Problem ja nur beim debuggen auftritt, könntest du das VERMUTLICH 
recht einfach mit einer bedingten Compileranweisung umgehen.
Dazu müsstest du natürlich wissen was das ist und wo du die einsetzen 
musst...

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Dabei sollte dir eigentlich klar werden, dass in deinem Projekt keine
> Sektion definiert sein darf, die sich mit den Debug Resourcen
> überschneidet, wenn debuggen möglich sein soll

Was meinst du bitte hier genau?
Danke

von Volker S. (vloki)


Lesenswert?

Die Debug Executive benötigt den Speicherbereich 0x7DC0-0x7FFF *1.
Im Linker Script wird aber eine SEKTION namens SERIAL reserviert.
1
CODEPAGE   NAME=serial    START=0x7FC0    END=0x7FFF   PROTECTED
2
...
3
SECTION    NAME=SERIAL     ROM=serial

Der Speicherbereich kann ja vom Linker nicht zweimal verwendet werden.
Er ist von deinem Programm belegt von 0x7FC0...0x7FD1 *2 und der 
Debugger braucht ihn von 0x7DC0...0x7FFF. Das heißt, dein Programm liegt 
teilweise im verbotenen Bereich.

Deshalb bekommst du beim Debug-Build den Fehler
1
Error - section 'dbgP0' can not fit the absolute section. Section 'dbgP0' start=0x00007dc0, length=0x00000240
 *3


Sorry, ich habe das Gefühl du bist mit dem Projekt hoffnungslos 
überfordert und nicht bereit zu akzeptieren, das es jede Menge 
Grundlagen gibt, die du erst noch lernen musst um damit zurecht zu 
kommen.
Wenn der Rest dann auch so ein Chaos ist wie das verpfuschte Linker 
Skript kommst du damit nirgendwo hin ;-)

------------------------------------------------------------------
*1 Volker S. schrieb:
> Für den 4550 sieht das übrigens so aus:

*2 http://www.microchip.com/forums/FindPost/1005961

*3 http://www.microchip.com/forums/FindPost/1005440

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:

--> Für deine Erklärung vielen Dank.
Das habe ich verstanden.
Die Frage ist: Nach welchen Muster kann ich die speicher aufteilen, 
damit ich solche Problem mit der Linker in verbindung mit der Debugger 
vermeiden kann.

> Sorry, ich habe das Gefühl du bist mit dem Projekt hoffnungslos
> überfordert.
Ehrlich gesagt ja aber ich gebe mein besten...
> Wenn der Rest dann auch so ein Chaos ist wie das verpfuschte Linker
> Skript kommst du damit nirgendwo hin ;-)
Ja ist es, aber erst mal nicht priorität eins

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Die Frage ist: Nach welchen Muster kann ich die speicher aufteilen,

Du kannst die Speicher gar nicht aufteilen. Das ist eine Beschreibung 
der unveränderlichen Realität!

Die Frage, die sich schon seit geraumer Zeit stellt und die ich gebeten 
habe zu klären, ist: "Wofür ist diese SERIAL Sektion?"

Poste doch mal die Datei mit den usb Descriptoren. Da sollte nicht 
alzuviel geheimnisvolles drin stehen.




Saheb schrieb:
> Ja ist es, aber erst mal nicht priorität eins

Auch wenn es Priorität eins wäre das Dach zu decken.
Das ist einfach unmöglich solange noch nicht mal die Fundamente 
betoniert wurden ...

von Saheb (Gast)


Lesenswert?

danke nochmal
1
 
2
/*********************************************************************
3
 * Descriptor specific type definitions are defined in:
4
 * usb_device.h
5
 *
6
 * Configuration options are defined in:
7
 * usb_config.h
8
 ********************************************************************/
9
#ifndef __USB_DESCRIPTORS_C
10
#define __USB_DESCRIPTORS_C
11
12
/** INCLUDES *******************************************************/
13
#include "./USB/usb.h"
14
#include "./USB/usb_function_hid.h"
15
16
/** CONSTANTS ******************************************************/
17
#if defined(__18CXX)
18
//#pragma romdata
19
#endif
20
21
/* Device Descriptor */
22
ROM USB_DEVICE_DESCRIPTOR device_dsc=
23
{
24
    0x12,    // Size of this descriptor in bytes
25
    USB_DESCRIPTOR_DEVICE,                // DEVICE descriptor type
26
    0x0200,                 // USB Spec Release Number in BCD format
27
    0x00,                   // Class Code
28
    0x00,                   // Subclass code
29
    0x00,                   // Protocol code
30
    USB_EP0_BUFF_SIZE,          // Max packet size for EP0, see usb_config.h
31
    0x04D8,                 // Vendor ID
32
    0x003F,                 // Product ID: Mouse in a circle fw demo
33
    0x0002,                 // Device release number in BCD format
34
    0x01,                   // Manufacturer string index
35
    0x02,                   // Product string index
36
    0x03,                   // Device serial number string index
37
    0x01                    // Number of possible configurations
38
};
39
40
/* Configuration 1 Descriptor */
41
ROM BYTE configDescriptor1[]={
42
    /* Configuration Descriptor */
43
    0x09,//sizeof(USB_CFG_DSC),    // Size of this descriptor in bytes
44
    USB_DESCRIPTOR_CONFIGURATION,                // CONFIGURATION descriptor type
45
    0x29,0x00,            // Total length of data for this cfg
46
    1,                      // Number of interfaces in this cfg
47
    1,                      // Index value of this configuration
48
    0,                      // Configuration string index
49
    _DEFAULT | _SELF,               // Attributes, see usb_device.h
50
    50,                     // Max power consumption (2X mA)
51
              
52
    /* Interface Descriptor */
53
    0x09,//sizeof(USB_INTF_DSC),   // Size of this descriptor in bytes
54
    USB_DESCRIPTOR_INTERFACE,               // INTERFACE descriptor type
55
    0,                      // Interface Number
56
    0,                      // Alternate Setting Number
57
    2,                      // Number of endpoints in this intf
58
    HID_INTF,               // Class code
59
    0,     // Subclass code
60
    0,     // Protocol code
61
    0,                      // Interface string index
62
63
    /* HID Class-Specific Descriptor */
64
    0x09,//sizeof(USB_HID_DSC)+3,    // Size of this descriptor in bytes
65
    DSC_HID,                // HID descriptor type
66
    0x11,0x01,                 // HID Spec Release Number in BCD format (1.11)
67
    0x00,                   // Country Code (0x00 for Not supported)
68
    HID_NUM_OF_DSC,         // Number of class descriptors, see usbcfg.h
69
    DSC_RPT,                // Report descriptor type
70
    HID_RPT01_SIZE,0x00,//sizeof(hid_rpt01),      // Size of the report descriptor
71
    
72
    /* Endpoint Descriptor */
73
    0x07,/*sizeof(USB_EP_DSC)*/
74
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
75
    HID_EP | _EP_IN,                   //EndpointAddress
76
    _INTERRUPT,                       //Attributes
77
    0x40,0x00,                  //size
78
    0x01,                        //Interval
79
80
    /* Endpoint Descriptor */
81
    0x07,/*sizeof(USB_EP_DSC)*/
82
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
83
    HID_EP | _EP_OUT,                   //EndpointAddress
84
    _INTERRUPT,                       //Attributes
85
    0x40,0x00,                  //size
86
    0x01                        //Interval
87
};
88
89
90
//Language code string descriptor
91
ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={
92
sizeof(sd000),USB_DESCRIPTOR_STRING,{0x0409
93
}};
94
95
//Manufacturer string descriptor
96
ROM struct{BYTE bLength;BYTE bDscType;WORD string[11];}sd001={
97
sizeof(sd001),USB_DESCRIPTOR_STRING,
98
{
99
'G','m','b','H'
100
}};
101
102
//Product string descriptor
103
ROM struct{BYTE bLength;BYTE bDscType;WORD string[31];}sd002={
104
sizeof(sd002),USB_DESCRIPTOR_STRING,
105
{
106
'D',
107
}};
108
109
#pragma romdata SERIAL
110
ROM struct{BYTE bLength;BYTE bDscType;WORD string[8];}sd003={
111
sizeof(sd003),USB_DESCRIPTOR_STRING,{'6','9','0','0','0','0','0','1'}
112
};
113
#pragma romdata
114
115
//Class specific descriptor - HID 
116
ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={
117
{
118
    0x06, 0x00, 0xFF,       // Usage Page = 0xFF00 (Vendor Defined Page 1)
119
    0x09, 0x01,             // Usage (Vendor Usage 1)
120
    0xA1, 0x01,             // Collection (Application)
121
    0x19, 0x01,             //      Usage Minimum 
122
    0x29, 0x40,             //      Usage Maximum   //64 input usages total (0x01 to 0x40)
123
    0x15, 0x00,             //      Logical Minimum (data bytes in the report may have minimum value = 0x00)
124
    0x26, 0xFF, 0x00,       //      Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
125
    0x75, 0x08,             //      Report Size: 8-bit field size
126
    0x95, 0x40,             //      Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item)
127
    0x81, 0x00,             //      Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage.
128
    0x19, 0x01,             //      Usage Minimum 
129
    0x29, 0x40,             //      Usage Maximum   //64 output usages total (0x01 to 0x40)
130
    0x91, 0x00,             //      Output (Data, Array, Abs): Instantiates output packet fields.  Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
131
    0xC0}                   // End Collection
132
};                  
133
134
135
//Array of configuration descriptors
136
ROM BYTE *ROM USB_CD_Ptr[]=
137
{
138
    (ROM BYTE *ROM)&configDescriptor1
139
};
140
141
//Array of string descriptors
142
ROM BYTE *ROM USB_SD_Ptr[]=
143
{
144
    (ROM BYTE *ROM)&sd000,
145
    (ROM BYTE *ROM)&sd001,
146
    (ROM BYTE *ROM)&sd002,
147
  (ROM BYTE *ROM)&sd003
148
};
149
150
/** EOF usb_descriptors.c ***************************************************/
151
152
#endif

von Volker S. (vloki)


Lesenswert?

Ok, da ist so ein #pragma romdata SERIAL
Das sorgt dafür, dass der String sd003 genau an der Adresse 0xFDC0 im 
ROM steht. (0x03,  // Device serial number string index)

Ändere das mal auf:
#ifndef __DEBUG
   #pragma romdata SERIAL
#endif

von Saheb (Gast)


Lesenswert?

Hallo,

Compilieren einwandfrei
das Debuggen leider nicht
Error:
1
Error - section 'dbgP0' can not fit the absolute section. Section 'dbgP0' start=0x00007d30, length=0x000002d0

von Volker S. (vloki)


Lesenswert?

Quatsch, das ist eine Meldung des Compilers/Linkers.
Bis zum Debuggen kommt das doch gar nicht!

von Saheb (Gast)


Lesenswert?

Sorry Tipp Fehler
Ich bekomme folgende Errors:
1
make[2]: Leaving directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
2
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
3
make[1]: Leaving directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
4
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
5
6
7
make[1]: *** [.build-conf] Error 2
8
make: *** [.build-impl] Error 2
9
10
BUILD FAILED (exit value 2, total time: 1s)

von Volker S. (vloki)


Lesenswert?

Vielleicht taucht das sonst noch wo auf.
Kommentiere doch die zwei Seciton Zeilen im Linker Script aus, dann wird 
man schon sehen...

DIE PAGE ZEILE MUSS DANN NATÜRLICH bis 0x7FFF...

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Ich habe die beide Zeilen in Linker gelöscht aber ich bekomme immer die 
gleiche Fehlermeldung.
1
make[2]: Leaving directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
2
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
3
make[1]: Leaving directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
4
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
5
make[1]: *** [.build-conf] Error 2
6
make: *** [.build-impl] Error 2
7
8
BUILD FAILED (exit value 2, total time: 1s)

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Ich bekomme folgende Errors:

Poste doch bitte den gesamten Build Output. Mit dem obigen kann man gar 
nichts anfangen. Unbedingt CLEAN AND BUILD!

von Saheb (Gast)


Lesenswert?

Ich habe es gepasst aber trotzdem immer die gleiche Fehlermeldung

von Saheb (Gast)


Lesenswert?

Das habe ich auch so immer gemacht CLEAN AND BUILD

von Saheb (Gast)


Lesenswert?

1
CLEAN SUCCESSFUL (total time: 102ms)
2
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
3
make[1]: Entering directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
4
make  -f nbproject/Makefile-default.mk dist/default/production/EFI_Firmware_HID.X.production.hex
5
make[2]: Entering directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
6
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -I".." -I"C:/MCC18/h" -I"C:/Microchip Solutions/Microchip/Include" -I"." -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/_ext/1494620250/usb_function_hid.o   "C:/Microchip Solutions/Microchip/USB/HID Device Driver/usb_function_hid.c" 
7
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -I".." -I"C:/MCC18/h" -I"C:/Microchip Solutions/Microchip/Include" -I"." -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/_ext/1472/usb_descriptors.o   ../usb_descriptors.c 
8
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -I".." -I"C:/MCC18/h" -I"C:/Microchip Solutions/Microchip/Include" -I"." -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/_ext/1472/main.o   ../main.c 
9
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -I".." -I"C:/MCC18/h" -I"C:/Microchip Solutions/Microchip/Include" -I"." -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/_ext/1472/i2c_func.o   ../i2c_func.c 
10
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -I".." -I"C:/MCC18/h" -I"C:/Microchip Solutions/Microchip/Include" -I"." -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/_ext/1472/asic_func_mo.o   ../asic_func_mo.c 
11
"C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin\mcc18.exe"  -p18F4550 -I".." -I"C:/MCC18/h" -I"C:/Microchip Solutions/Microchip/Include" -I"." -ms -oa-  -I "C:\Program Files (x86)\Microchip\mplabc18\v3.47\bin"\\..\\h  -fo build/default/production/_ext/1302440332/usb_device.o   "C:/Microchip Solutions/Microchip/USB/usb_device.c" 
12
MPLAB C18 3.47 (evaluation)
13
Copyright 2000-2011 Microchip Technology Inc.
14
Days remaining until evaluation becomes feature limited:  54
15
16
WARNING:  Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.
17
18
WARNING: The procedural abstraction optimization will not be supported when the evaluation becomes feature limited.
19
20
D:\Projekte\HID-Firmware-HR\i2c_func.c:88:Warning [2054] suspicious pointer conversion
21
D:\Projekte\HID-Firmware-HR\i2c_func.c:259:Warning [2058] call of function without prototype
22
D:\Projekte\HID-Firmware-HR\i2c_func.c:261:Warning [2058] call of function without prototype
23
D:\Projekte\HID-Firmware-HR\i2c_func.c:280:Warning [2054] suspicious pointer conversion
24
D:\Projekte\HID-Firmware-HR\i2c_func.c:309:Warning [2054] suspicious pointer conversion
25
D:\Projekte\HID-Firmware-HR\i2c_func.c:401:Warning [2054] suspicious pointer conversion
26
D:\Projekte\HID-Firmware-HR\i2c_func.c:452:Warning [2054] suspicious pointer conversion
27
D:\Projekte\HID-Firmware-HR\usb_descriptors.c:161:Error [1030] identifier expected in #ifdef
28
MPLAB C18 3.47 (evaluation)
29
Copyright 2000-2011 Microchip Technology Inc.
30
Days remaining until evaluation becomes feature limited:  54
31
32
WARNING:  Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.
33
34
WARNING: The procedural abstraction optimization will not be supported when the evaluation becomes feature limited.
35
36
MPLAB C18 3.47 (evaluation)
37
Copyright 2000-2011 Microchip Technology Inc.
38
Days remaining until evaluation becomes feature limited:  54
39
40
WARNING:  Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.
41
42
WARNING: The procedural abstraction optimization will not be supported when the evaluation becomes feature limited.
43
44
make[2]: *** [build/default/production/_ext/1472/usb_descriptors.o] Error 3
45
make[2]: *** Waiting for unfinished jobs....
46
nbproject/Makefile-default.mk:162: recipe for target 'build/default/production/_ext/1472/usb_descriptors.o' failed
47
MPLAB C18 3.47 (evaluation)
48
Copyright 2000-2011 Microchip Technology Inc.
49
Days remaining until evaluation becomes feature limited:  54
50
51
WARNING:  Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.
52
53
WARNING: The procedural abstraction optimization will not be supported when the evaluation becomes feature limited.
54
55
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2242:Warning [2060] shift expression has no effect
56
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2242:Warning [2060] shift expression has no effect
57
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2246:Warning [2060] shift expression has no effect
58
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2246:Warning [2060] shift expression has no effect
59
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2258:Warning [2060] shift expression has no effect
60
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2258:Warning [2060] shift expression has no effect
61
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2296:Warning [2060] shift expression has no effect
62
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2296:Warning [2060] shift expression has no effect
63
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2300:Warning [2060] shift expression has no effect
64
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2300:Warning [2060] shift expression has no effect
65
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2312:Warning [2060] shift expression has no effect
66
D:\Projekte\HID-Firmware-HR\asic_func_mo.c:2312:Warning [2060] shift expression has no effect
67
MPLAB C18 3.47 (evaluation)
68
Copyright 2000-2011 Microchip Technology Inc.
69
Days remaining until evaluation becomes feature limited:  54
70
71
WARNING:  Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.
72
73
WARNING: The procedural abstraction optimization will not be supported when the evaluation becomes feature limited.
74
75
D:\Projekte\HID-Firmware-HR\main.c:427:Warning [2060] shift expression has no effect
76
D:\Projekte\HID-Firmware-HR\main.c:427:Warning [2060] shift expression has no effect
77
D:\Projekte\HID-Firmware-HR\main.c:439:Warning [2060] shift expression has no effect
78
D:\Projekte\HID-Firmware-HR\main.c:439:Warning [2060] shift expression has no effect
79
D:\Projekte\HID-Firmware-HR\main.c:446:Warning [2060] shift expression has no effect
80
D:\Projekte\HID-Firmware-HR\main.c:446:Warning [2060] shift expression has no effect
81
MPLAB C18 3.47 (evaluation)
82
Copyright 2000-2011 Microchip Technology Inc.
83
Days remaining until evaluation becomes feature limited:  54
84
85
WARNING:  Running the compiler in extended mode will not be supported when the evaluation becomes feature limited.
86
87
WARNING: The procedural abstraction optimization will not be supported when the evaluation becomes feature limited.
88
89
make[1]: *** [.build-conf] Error 2
90
make: *** [.build-impl] Error 2
91
make[2]: Leaving directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
92
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
93
make[1]: Leaving directory 'D:/Projekte/HID-Firmware-HR/EFI Firmware HID.X'
94
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
95
96
BUILD FAILED (exit value 2, total time: 1s)

von Saheb (Gast)


Lesenswert?

Sorry sorry wieder eine tipp Fehler von mir
Das Build geht
Das Debuggen aber nicht.
Error :
1
Error - section '.stack' has a memory 'gpr3' which can not fit the section. Section '.stack' length=0x00000100.
2
Errors    : 1

von Volker S. (vloki)


Lesenswert?

Kommt auch vom vermurksten Linker Skript.

Die Debug Executive belegt Speicher in BANK3 von 0x3F4...0x3FF,
Dann sind da natürlich keine 0x100 Bytes mehr übrig.
(siehe screenshot93 weiter oben ;-)

>> Stack verkleinern oder auf andere BANK
- STACK SIZE=0x0F4 RAM=gpr3
- STACK SIZE=0x100 RAM=gpr2

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Guten Morgen,


Der Linker script sieht jetzt so aus:
1
LIBPATH .
2
3
FILES c018i.o
4
FILES clib.lib
5
FILES p18f4550.lib
6
7
CODEPAGE   NAME=bootloader START=0x0               END=0x002F         PROTECTED
8
CODEPAGE   NAME=vectors    START=0x0030            END=0x0059        PROTECTED
9
CODEPAGE   NAME=page       START=0x0060            END=0x7FFF
10
CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
11
CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
12
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
13
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF000FF       PROTECTED
14
15
ACCESSBANK NAME=accessram  START=0x0            END=0x5F
16
DATABANK   NAME=gpr0       START=0x60           END=0xFF
17
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
18
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
19
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
20
DATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTED
21
DATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTED
22
DATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTED
23
DATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTED
24
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED
25
26
SECTION    NAME=CONFIG     ROM=config
27
28
STACK SIZE=0x100 RAM=gpr2
29
30
SECTION     NAME=USB_VARS   RAM=usb4

von Saheb (Gast)


Lesenswert?

Mit dieses Linker kann ich das projekt compilieren.
Problem ist beim debuggen.
Ich bekomme immer diese Fehlermeldung:
1
The following memory area(s) will be programmed:
2
program memory: start address = 0x0, end address = 0x7d3f
3
configuration memory
4
Debug Executive
5
Address: 7d30 Expected Value: 14 Received Value: 0
6
Failed to program device

von Volker S. (vloki)


Lesenswert?

Es kam noch nie zum Debuggen!

Bisher waren die Probleme immer beim Build,
jetzt beim Programmieren!

Was mich etwas wundert, ist warum anfangs die Debug Executive den 
Speicher ab 0x7DC0 beansprucht hat und jetzt ab 0x7D30.

Beim Programmieren passiert ja folgendes:
- der Programmspeicher wird gelöscht
  -> alle Bits werden zu 1, alles ist 0xFFFF
- dann wird der Programmspeicher programmiert
  -> manche Bits werden zu 0

Bei dir wird aus irgendwelchen Gründen der Programmspeicher zuerst bis 
0x7D3F beschrieben und dann folgt die Debug Executive ab 0x7D30.
Dummer Weise wurde der Speicher an 0x7D30 mit 0 beschreiben und beim 
Programmieren können keine Bits gesetzt werden...


Ist in den Einstellungen für das Programmier/Debug Tool etwas 
eingetragen?
-> http://microchipdeveloper.com/icd3:select-memory-to-program

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
wenn ich die das Projekt so einstelle (Seh bitte Anhang), dann bekomme 
ich folgende Error beim Debuggen:
1
Failed to program device
2
The selected program range, 0-7fff, does not fall within the proper range for the memory area selected. Please check the manual program ranges on the debug tool's, "Memories to Program" property page.

von Volker S. (vloki)


Lesenswert?

Stell's halt auf Automatic oder auf 0-0x7D2F ;-)

: Bearbeitet durch User
von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es jetzt so eingestellt("seh Anhang").

Ich bekomme aber diese Fehlermeldung:
1
program memory: start address = 0x0, end address = 0x7d3f
2
configuration memory
3
Debug Executive
4
Address: 7d30 Expected Value: 14 Received Value: 0
5
Failed to program device

von Volker S. (vloki)


Lesenswert?

Was passiert bei manuell 0-7d2f?

von Saheb (Gast)


Lesenswert?

1
program memory: start address = 0x0, end address = 0x7d3f
2
configuration memory
3
Debug Executive
4
Address: 7d30 Expected Value: 14 Received Value: 0
5
Failed to program device

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

So sieht es aus meine Änderung

von Volker S. (vloki)


Lesenswert?

So langsam glaub ich, du willst mich verarschen. Das ist nicht manuell!
Wie blind kann man eigentlich sein?

: Bearbeitet durch User
von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Nein
warum soll ich dich verarschen.Ich habe deine vorschlag "Stell's halt 
auf Automatic oder auf 0-0x7D2F" falsch interpretiert. Sorry

Ich bekomme dann diese Fehlermeldung beim program und das gleiche auch 
beim debuggen.
1
Failed to program device
2
Invalid program range received: end address 7D2F is not aligned on a proper 0x3f address boundary. Please check the manual program ranges on the debug tool's, "Memories to Program" property page.

von Volker S. (vloki)


Lesenswert?

Jetzt lies nochmal die Fehlermeldung und denk ein klitze kleines 
bisschen mit. Wie lautet die nächst kleinere Adresse die passt?

von Saheb (Gast)


Lesenswert?

Das hier:
1
0x7d3f

von Volker S. (vloki)


Lesenswert?

Falsch!

von Saheb (Gast)


Lesenswert?

Nächste Zahl nach 7D2F ist 7D30

von Volker S. (vloki)


Lesenswert?

Welche Bedeutung hat das Adjektiv "kleiner"?

von Saheb (Gast)


Lesenswert?

kleiner als (7D2F) halt:
7D2E

von Saheb (Gast)


Lesenswert?

Ich weiss es nicht wie du auf diese Adresse "7D2F" gekommen bist.
richtig wäre aber diese Adresse "7D3F", die du eigentlich meinst.

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Ich weiss es nicht wie du auf diese Adresse "7D2F"

Die Adresse muss kleiner sein als der Start der Debg Exekutive.

Saheb schrieb:
> Invalid program range received: end address 7D2F is not aligned on a
> proper 0x3f address boundary.

Da wusste ich noch nicht, das die Adresse auf 3F, 7F, usw...
enden muss ;-)

Also letzter Versuch: Wie lautet die größte passende Adresse, die 
kleiner ist als die Startadresse der Debug-Exekutive?

von Saheb (Gast)


Lesenswert?

@Volker S
danke für deine Hilfe.

Volker S. schrieb:
> Also letzter Versuch: Wie lautet die größte passende Adresse, die
> kleiner ist als die Startadresse der Debug-Exekutive?

Als Antwort auf deine Frage:
Ich kann dich leider nicht verfolgen: Wo sehe ich die Start Adresse der 
"Debug-Excekutive":?

Danke dir und Sorry sorry für die Umstände.
Ich will deine zeit nicht vergolden aber ich weiss es einfach nicht

von Volker S. (vloki)


Lesenswert?

z.B da ->
Saheb schrieb:
> Debug Executive
> Address: 7d30 Expected Value: 14 Received Value: 0
> Failed to program device

und gleich nochmal:
Saheb schrieb:
> Debug Executive
> Address: 7d30 ...

und dann nochmal von mir:
Volker S. schrieb:
> und dann folgt die Debug Executive ab 0x7D30.

: Bearbeitet durch User
von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

@ Volker SK (vloki)


Vielen vielen dank für deine Geduld und einfach alles.
Jetzt geht

Ich kann schon debuggen.

Super

von Volker S. (vloki)


Lesenswert?

Vergiss das Problem mit der Seriennummer nicht.
Am Ende muss die möglicherweise wieder genau da stehen , wo sie war...

von Saheb (Gast)


Lesenswert?

noch eine letze Frage.
das heisst, dass es bei der Linker:
1
CODEPAGE   NAME=serial     START=0x7FC0         END=0x7FFF  PROTECTED

dieses gar nicht zu gebrauchen ist.

Der Linker in der zwischen habe ich so angepasst:
1
LIBPATH .
2
3
FILES c018i.o
4
FILES clib.lib
5
FILES p18f4550.lib
6
7
CODEPAGE   NAME=bootloader START=0x0               END=0x002F         PROTECTED
8
CODEPAGE   NAME=vectors    START=0x0030            END=0x0059        PROTECTED
9
CODEPAGE   NAME=page       START=0x0060            END=0x7FFF
10
CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
11
CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
12
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
13
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF000FF       PROTECTED
14
15
ACCESSBANK NAME=accessram  START=0x0            END=0x5F
16
DATABANK   NAME=gpr0       START=0x60           END=0xFF
17
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
18
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
19
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
20
DATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTED
21
DATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTED
22
DATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTED
23
DATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTED
24
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED
25
26
#IFDEF _CRUNTIME
27
SECTION    NAME=CONFIG     ROM=config
28
29
//STACK SIZE=0x100 RAM=gpr3
30
    #IFDEF _DEBUGSTACK
31
    STACK SIZE=0x100 RAM=gpr2
32
    #ELSE
33
    STACK SIZE=0x0F4 RAM=gpr3
34
    #FI
35
#FI
36
SECTION     NAME=USB_VARS   RAM=usb4

von Volker S. (vloki)


Lesenswert?

Den ganzen Bootloader und Vectors Blödsinn solltest du auch entfernen.
Ach was, entferne am besten die Linker Script Datei aus dem Projekt, 
dann wird das Standard-Script genommen ;-)

Im Descriptor-File kannst du das mal so probieren:
1
//#pragma romdata SERIAL
2
#ifndef __DEBUG
3
    #pragma romdata serilanumber = 0x7FC0
4
#endif
5
const struct{uint8_t bLength;uint8_t bDscType;uint16_t string[8];}sd003={
6
sizeof(sd003),USB_DESCRIPTOR_STRING,{'6','9','0','0','0','0','0','1'}
7
};
8
#pragma romdata
Siehe User Guide vom Compiler -> 2.9.1 #pragma sectiontype

von Saheb (Gast)


Lesenswert?

vielen dank nochmal
Ich habe noch einen Frage wofür die serialnummer?
1
   #pragma romdata serialanumber = 0x7FC0

von Volker S. (vloki)


Lesenswert?

Die Seriennummer ist das da -> 6','9','0','0','0','0','0','1
Was das andere ist solltest du inzwischen eigentlich wissen.
Wenn nicht lies einfach mal im User Guide nach...

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

beim Integrieren von einem alten Projekt Mplab 8.92 in MPLAB X bekomme 
ich folgende Error "Seh bitte Anhang" und damit kann ich nicht das 
Import zu ende führen.

von Volker S. (vloki)


Lesenswert?

Ja das "other has a different root" kannst du vermutlich nicht 
überwinden.
Das bedeutet, dass die Projektdateien von verschiedenen Laufwerken 
kommen.

Dann musst du das Projekt eben manuell aus den alten Dateien und 
Einstellungen zusammen stöpseln...

PS: keine Leer- und sonstige Zeichen in Projektdateien und Pfaden!

von Patrick B. (p51d)


Lesenswert?

Saheb schrieb:
> bekomme ich folgende Error

Also ich sehe keinen Fehler... ev. solltest du den kompletten Auszug der 
Summary hier rein kopieren.
Ich habe den Thread ja nur überflogen, aber mal ernsthaft: Bedienst du 
zum ersten mal einen Computer? Und da fragen sich die Leute wieso ein 
Support von einem Drucker fragt, ob er eingeschaltet ist...

von Saheb (Gast)


Lesenswert?

Hallo,
danke für den Hinweis.

Man kann das Projekt trotzdem integrieren in dem die abhängige 
Projektordner vorübergehen umbenennen.

Das Project wird dann importiert.

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Man kann das Projekt trotzdem integrieren in dem die abhängige
> Projektordner vorübergehen umbenennen.

Also die Dateien auf ein gemeinsames Laufwerk bringen und die *.mcp 
entsprechend editieren? Das ist natürlich auch eine Möglichkeit.

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

@Volker

Wie kann ich dich danken?

von Saheb (Gast)


Lesenswert?

@Volker

Codeabschnitt Review bzw. Feadback
1
/********************************************************************
2
 FileName:     main.c
3
 Dependencies: See INCLUDES section
4
 Processor:    PIC18F4550
5
 Complier:    Microchip C18 (for PIC18)
6
********************************************************************/
7
8
#ifndef MAIN_C
9
#define MAIN_C
10
11
/** INCLUDES *******************************************************/
12
13
#include <EEP.h>
14
#include <delays.h>
15
16
#include <timers.h>
17
18
19
/** VERSION INFO ****************************************************/
20
#define MAJOR_VERSION 9
21
#define MINOR_VERSION 15
22
#define DELAY10MS  Delay10KTCYx(10);
23
24
/** CONFIGURATION **************************************************/
25
        #pragma config PLLDIV   = 3         // (20 MHz crystal on PICDEM FS USB board)
26
        #pragma config CPUDIV   = OSC1_PLL2 
27
        #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
28
        #pragma config FOSC     = HSPLL_HS
29
        #pragma config FCMEN    = OFF
30
        #pragma config IESO     = OFF
31
        #pragma config PWRT     = OFF
32
        #pragma config BOR      = ON
33
        #pragma config BORV     = 3
34
        #pragma config VREGEN   = ON      //USB Voltage Regulator
35
        #pragma config WDT      = ON  
36
        #pragma config WDTPS    = 512  
37
        #pragma config MCLRE    = ON
38
        #pragma config LPT1OSC  = OFF
39
        #pragma config PBADEN   = OFF
40
//      #pragma config CCP2MX   = ON
41
        #pragma config STVREN   = ON
42
        #pragma config LVP      = OFF
43
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
44
        #pragma config XINST    = OFF       // Extended Instruction Set
45
        #pragma config CP0      = OFF
46
        #pragma config CP1      = OFF
47
//      #pragma config CP2      = OFF
48
//      #pragma config CP3      = OFF
49
        #pragma config CPB      = OFF
50
//      #pragma config CPD      = OFF
51
        #pragma config WRT0     = OFF
52
        #pragma config WRT1     = OFF
53
//      #pragma config WRT2     = OFF
54
//      #pragma config WRT3     = OFF
55
        #pragma config WRTB     = OFF       // Boot Block Write Protection
56
        #pragma config WRTC     = OFF
57
//      #pragma config WRTD     = OFF
58
        #pragma config EBTR0    = OFF
59
        #pragma config EBTR1    = OFF
60
//      #pragma config EBTR2    = OFF
61
//      #pragma config EBTR3    = OFF
62
        #pragma config EBTRB    = OFF
63
64
65
66
67
/** VARIABLES ******************************************************/
68
#pragma udata
69
70
#if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50) 
71
    #pragma udata usbram2
72
#elif defined(__18F2455) || defined(__18F2550) || defined(__18F4455) || defined(__18F4550)\
73
    || defined(__18F2458) || defined(__18F2453) || defined(__18F4558) || defined(__18F4553)
74
    #pragma udata USB_VARIABLES=0x500
75
#elif defined(__18F4450) || defined(__18F2450)
76
    #pragma udata USB_VARIABLES=0x480
77
#else
78
    #pragma udata
79
#endif
80
unsigned char ReceivedDataBuffer[64];
81
unsigned char ToSendDataBuffer[64];
82
#pragma udata
83
84
85
USB_HANDLE USBOutHandle = 0;
86
USB_HANDLE USBInHandle = 0;
87
BOOL blinkStatusValid = TRUE;
88
89
unsigned char ResetSignaturRAM[9];
90
const unsigned char ResetSignaturROM[9] = {0x55,0xAA,0x00,0xFF,0xA5,0x5A,0xF0,0x0F,0x00};
91
92
93
94
/** PRIVATE PROTOTYPES *********************************************/
95
void BlinkUSBStatus(void);
96
BOOL Switch2IsPressed(void);
97
BOOL Switch3IsPressed(void);
98
static void InitializeSystem(void);
99
void ProcessIO(void);
100
void UserInit(void);
101
void YourHighPriorityISRCode();
102
void YourLowPriorityISRCode();
103
WORD_VAL ReadPOT(void);
104
105
void vfuTestWatchdog(void);
106
107
/** VECTOR REMAPPING ***********************************************/
108
    #define PROGRAMMABLE_WHIT_USB_HID_BOOTLOADER
109
    
110
    #define REMAPPED_RESET_VECTOR_ADDRESS      0x0030
111
    #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS  0x0038
112
    #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS  0x0048
113
    
114
    
115
    extern void _startup (void);        // See c018i.c in your C18 compiler dir
116
    #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
117
    void _reset (void)
118
    {
119
        _asm goto _startup _endasm
120
    }
121
122
    #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
123
    void Remapped_High_ISR (void)
124
    {
125
         _asm goto YourHighPriorityISRCode _endasm
126
    }
127
    #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
128
    void Remapped_Low_ISR (void)
129
    {
130
         _asm goto YourLowPriorityISRCode _endasm
131
    }
132
    
133
    #pragma code HIGH_INTERRUPT_VECTOR = 0x08
134
    void High_ISR (void)
135
    {
136
         _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
137
    }
138
    #pragma code LOW_INTERRUPT_VECTOR = 0x18
139
    void Low_ISR (void)
140
    {
141
         _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
142
    }
143
144
    #pragma code
145
    
146
    #pragma interrupt YourHighPriorityISRCode
147
    void YourHighPriorityISRCode()
148
    {
149
        int           i;
150
        #if defined(USB_INTERRUPT)
151
            USBDeviceTasks();
152
        #endif
153
//        if (INTCONbits.TMR0IF) //check for TMR0 overflow
154
//        {                                   
155
//          UCONbits.SUSPND = 0;    
156
//          UCON = 0x00;        
157
//          for(i = 0; i < 0xFF; i++) {
158
//            WREG = 0xFF;
159
//            while(WREG) {
160
//              WREG--;
161
//              _asm
162
//              bra  0  
163
//              bra  0  
164
//              _endasm  
165
//            }
166
//          }
167
//          Reset();
168
//        }
169
    }
170
    
171
    #pragma interruptlow YourLowPriorityISRCode
172
    void YourLowPriorityISRCode()
173
    {
174
    
175
    } 
176
177
/** DECLARATIONS ***************************************************/
178
#pragma code
179
180
/** Define function ***********************************************/
181
....
182
183
#define FIRMWARE_VERSION       0x08
184
#define RESET_DEVICE           0xFE
185
#define TEST_WATCHDOG          0xFF
186
187
#define TEST_MODE              0x30
188
/********************************************************************
189
 * Function:        void main(void)
190
 * PreCondition:    None
191
 * Input:           None
192
 * Output:          None
193
 * Side Effects:    None
194
 * Overview:        Main program entry point.
195
 * Note:            None
196
 *******************************************************************/
197
#if defined(__18CXX)
198
void main(void)
199
#else
200
int main(void)
201
#endif
202
{   
203
204
    // postscaler = 512, damit 4ms*512 = 2.048s timeout
205
    ClrWdt();  
206
207
    InitializeSystem();
208
209
    ClrWdt();
210
211
    #if defined(USB_INTERRUPT)
212
        USBDeviceAttach();
213
    #endif
214
215
    ClrWdt();
216
217
  //vfuTestWatchdog();
218
219
    while(1)
220
    {
221
       ClrWdt();
222
223
        #if defined(USB_POLLING)
224
        // Check bus status and service USB interrupts.
225
        USBDeviceTasks(); // Interrupt or polling method.  If using polling, must call
226
                          // this function periodically.  This function will take care
227
                          // of processing and responding to SETUP transactions 
228
                          // (such as during the enumeration process when you first
229
                          // plug in).  USB hosts require that USB devices should accept
230
                          // and process SETUP packets in a timely fashion.  Therefore,
231
                          // when using polling, this function should be called 
232
                          // frequently (such as once about every 100 microseconds) at any
233
                          // time that a SETUP packet might reasonably be expected to
234
                          // be sent by the host to your device.  In most cases, the
235
                          // USBDeviceTasks() function does not take very long to
236
                          // execute (~50 instruction cycles) before it returns.
237
        #endif
238
                      
239
240
        // Application-specific tasks.
241
        // Application related code may be added here, or in the ProcessIO() function.
242
        ProcessIO();   
243
     
244
    }//end while
245
}//end main 
246
 
247
#if 0
248
unsigned char ucfuLrcChecksum(unsigned char *pucBuff_p, int iBufflen_p)
249
{
250
  int i;
251
  unsigned char ucLrc_l=0;
252
  for (i=0; i<iBufflen_p; i++)
253
  {
254
    ucLrc_l = ucLrc_l ^ pucBuff_p[i];
255
  }
256
  
257
  return ucLrc_l;
258
}
259
260
261
void vfuTestWatchdog(void)
262
{
263
  unsigned char i;
264
265
  ResetSignaturRAM[8] = 1;
266
267
  for (i=0; i<8; i++)
268
  {
269
    if (ResetSignaturRAM[i] != ResetSignaturROM[i])
270
    {
271
      ResetSignaturRAM[8] = 0;
272
    }
273
  }
274
    
275
  if (ResetSignaturRAM[8] == 0)
276
  {
277
    for (i=0; i<8; i++)
278
    {
279
      ResetSignaturRAM[i] = ResetSignaturROM[i];
280
    }
281
  }
282
}
283
#endif
284
285
286
static void InitializeSystem(void)
287
{
288
   char Data[3]; 
289
    #if (defined(__18CXX) & !defined(PIC18F87J50_PIM))
290
        ADCON1 |= 0x0F;                 // Default all pins to digital
291
    #elif defined(__C30__)
292
        #if defined(__PIC24FJ256DA210__) || defined(__PIC24FJ256GB210__)
293
            ANSA = 0x0000;
294
            ANSB = 0x0000;
295
            ANSC = 0x0000;
296
            ANSD = 0x0000;
297
            ANSE = 0x0000;
298
            ANSF = 0x0000;
299
            ANSG = 0x0000;
300
        #else
301
            AD1PCFGL = 0xFFFF;
302
        #endif        
303
    #elif defined(__C32__)
304
        AD1PCFG = 0xFFFF;
305
    #endif
306
307
308
309
//  The USB specifications require that USB peripheral devices must never source
310
//  current onto the Vbus pin.  Additionally, USB peripherals should not source
311
//  current on D+ or D- when the host/hub is not actively powering the Vbus line.
312
//  When designing a self powered (as opposed to bus powered) USB peripheral
313
//  device, the firmware should make sure not to turn on the USB module and D+
314
//  or D- pull up resistor unless Vbus is actively powered.  Therefore, the
315
//  firmware needs some means to detect when Vbus is being powered by the host.
316
//  A 5V tolerant I/O pin can be connected to Vbus (through a resistor), and
317
//   can be used to detect when Vbus is high (host actively powering), or low
318
//  (host is shut down or otherwise not supplying power).  The USB firmware
319
//   can then periodically poll this I/O pin to know when it is okay to turn on
320
//  the USB module/D+/D- pull up resistor.  When designing a purely bus powered
321
//  peripheral device, it is not possible to source current on D+ or D- when the
322
//  host is not actively providing power on Vbus. Therefore, implementing this
323
//  bus sense feature is optional.  This firmware can be made to use this bus
324
//  sense feature by making sure "USE_USB_BUS_SENSE_IO" has been defined in the
325
//  HardwareProfile.h file.    
326
    #if defined(USE_USB_BUS_SENSE_IO)
327
    tris_usb_bus_sense = INPUT_PIN; // See HardwareProfile.h
328
    #endif
329
    
330
//  If the host PC sends a GetStatus (device) request, the firmware must respond
331
//  and let the host know if the USB peripheral device is currently bus powered
332
//  or self powered.  See chapter 9 in the official USB specifications for details
333
//  regarding this request.  If the peripheral device is capable of being both
334
//  self and bus powered, it should not return a hard coded value for this request.
335
//  Instead, firmware should check if it is currently self or bus powered, and
336
//  respond accordingly.  If the hardware has been configured like demonstrated
337
//  on the PICDEM FS USB Demo Board, an I/O pin can be polled to determine the
338
//  currently selected power source.  On the PICDEM FS USB Demo Board, "RA2" 
339
//  is used for  this purpose.  If using this feature, make sure "USE_SELF_POWER_SENSE_IO"
340
//  has been defined in HardwareProfile.h, and that an appropriate I/O pin has been mapped
341
//  to it in HardwareProfile.h.
342
    #if defined(USE_SELF_POWER_SENSE_IO)
343
    tris_self_power = INPUT_PIN;  // See HardwareProfile.h
344
    #endif
345
346
    UserInit();
347
    USBDeviceInit();  //usb_device.c.  Initializes USB module SFRs and firmware
348
                                //variables to known states.
349
    InitPort();
350
      i2c_init();
351
      i2c_confChips();
352
} //end InitializeSystem
353
354
355
356
void UserInit(void)
357
{
358
    unsigned char timerConfig = 0x00;
359
360
    //Initialize all of the LED pins
361
    mInitAllLEDs();
362
    
363
    USBOutHandle = 0;
364
    USBInHandle = 0;
365
366
    blinkStatusValid = TRUE;
367
368
369
    timerConfig = T0_16BIT & T0_SOURCE_INT & T0_PS_1_1 & TIMER_INT_OFF;
370
    WriteTimer0(0x0000);
371
    OpenTimer0(timerConfig);
372
373
374
}//end UserInit
375
376
377
void ProcessIO(void) 
378
{
379
    static unsigned char ucTestMode_m = 0;
380
  static unsigned char ucSendResetString_m = 0;
381
    
382
    int i,j;
383
    unsigned char counter = 2;
384
    long int     Result;
385
386
    unsigned char ucModeFlag =1;
387
388
389
390
    //Blink the LEDs according to the USB device status
391
    if (blinkStatusValid) 
392
    {
393
        BlinkUSBStatus();
394
    }
395
396
    // User Application USB task1 
397
    if ((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) 
398
        return;
399
    
400
401
    if (!HIDRxHandleBusy(USBOutHandle)) 
402
    {  
403
404
    //Check if data was received from the host.
405
        switch(ReceivedDataBuffer[0]) 
406
        { //Look at the data the host sent, to see what kind of application specific command it sent.
407
408
            /**********************************************************************************/
409
            /*                                                                                */
410
            /**********************************************************************************/
411
      ....
412
            case TEST_MODE:
413
                ucTestMode_m = 1;
414
            break;  
415
416
            case INDEX_CHECK:
417
                if (ucTestMode_m == 0)
418
                {
419
                    //                                    +--------- n values must be true
420
                    //                                    |  
421
                    ToSendDataBuffer[2] = index_check_new(8);
422
                }
423
                else
424
                {
425
                    ToSendDataBuffer[2] = 0x1;
426
                }
427
428
                counter += 1;
429
            break;
430
        
431
            /**********************************************************************************/
432
            /*                                                                                */
433
            /**********************************************************************************/
434
            case FIRMWARE_VERSION:
435
                ToSendDataBuffer[2] = MAJOR_VERSION;
436
                ToSendDataBuffer[3] = MINOR_VERSION;
437
438
                counter += 2;
439
            break;
440
      
441
      case HW_DELAY1MS:
442
        hw_delay1ms(ReceivedDataBuffer[2]);
443
          
444
                ToSendDataBuffer[2] = 1; // true = OK
445
446
        counter += 1;      
447
      break;
448
449
            /**********************************************************************************/
450
            /*                                                                                */
451
            /**********************************************************************************/
452
      case EXTENDED_IO_WRTIE:
453
        extended_io_write(ReceivedDataBuffer[2], ReceivedDataBuffer[3]);
454
      break;
455
456
            /**********************************************************************************/
457
            /*                                                                                */
458
            /**********************************************************************************/
459
      case EXTENDED_IO_READ:
460
                ToSendDataBuffer[2] = extended_io_read(ReceivedDataBuffer[2]);
461
                counter += 1;
462
      break;
463
464
465
        //******************************
466
            case TEST_WATCHDOG:
467
        //******************************
468
                while(1);
469
            break;
470
471
472
            default:
473
        ReceivedDataBuffer[0] = 0;
474
            counter = 0;
475
            break;
476
477
478
479
        } //End switch
480
481
482
       
483
    ToSendDataBuffer[0] = ReceivedDataBuffer[0];
484
    ToSendDataBuffer[1] = counter;
485
    USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
486
    //Re-arm the OUT endpoint for the next packet
487
    USBOutHandle = HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64);
488
 }
489
490
}//end ProcessIO
491
492
493
void BlinkUSBStatus(void) {
494
  #if defined(PIC24FJ256DA210_DEV_BOARD)
495
     // No need to clear UIRbits.SOFIF to 0 here.
496
     // Callback caller is already doing that.
497
     #define BLINK_INTERVAL 20000
498
     #define BLANK_INTERVAL 200000
499
500
     static WORD blink_count=0;
501
     static DWORD loop_count = 0;
502
    
503
    if(loop_count == 0) {
504
      if(blink_count != 0) {
505
        loop_count = BLINK_INTERVAL;
506
        if(mGetLED_1()) {
507
          mLED_1_Off();
508
          blink_count--;
509
        }
510
        else {
511
          mLED_1_On();
512
        }
513
      }
514
      else {
515
        loop_count = BLANK_INTERVAL;
516
        switch (USBDeviceState) {
517
          case ATTACHED_STATE:
518
            blink_count = 1;
519
            break;
520
          case POWERED_STATE:
521
            blink_count = 2;
522
            break;
523
          case DEFAULT_STATE:
524
            blink_count = 3;
525
            break;
526
          case ADR_PENDING_STATE:
527
            blink_count = 4;
528
            break;
529
          case ADDRESS_STATE:
530
            blink_count = 5;
531
            break;
532
          case CONFIGURED_STATE:
533
            blink_count = 6;
534
            break;
535
          case DETACHED_STATE:
536
            //fall through
537
            default:
538
            blink_count = 0;
539
            break;
540
        }
541
      }
542
    }
543
    else {
544
      loop_count--;
545
    }
546
547
#else
548
    // No need to clear UIRbits.SOFIF to 0 here.
549
    // Callback caller is already doing that.
550
    static WORD led_count=0;
551
    
552
    if(led_count == 0)led_count = 10000000U;
553
    led_count--;
554
555
    #define mLED_Both_Off()         {mLED_1_green_Off();mLED_1_red_Off();}
556
    #define mLED_Both_On()          {mLED_1_green_On();mLED_1_red_On();}
557
    #define mLED_Only_1_On()        {mLED_1_green_On();mLED_1_red_Off();}
558
    #define mLED_Only_2_On()        {mLED_1_green_Off();mLED_1_red_On();}
559
    if(USBSuspendControl == 1) {
560
      if(led_count==0) {
561
        mLED_1_green_Toggle();
562
        if(mGetLED_1_green()) {
563
          mLED_1_red_On();
564
        }
565
        else {
566
          mLED_1_red_Off();
567
        }
568
      }//end if
569
    }
570
    else {
571
      if (USBDeviceState == DETACHED_STATE) {
572
        mLED_Both_Off();
573
      }
574
      else if (USBDeviceState == ATTACHED_STATE) {
575
        mLED_Both_On();
576
      }
577
      else if (USBDeviceState == POWERED_STATE) {
578
        mLED_Only_1_On();
579
      }
580
      else if (USBDeviceState == DEFAULT_STATE) {
581
        mLED_Only_2_On();
582
      }      else if (USBDeviceState == ADDRESS_STATE) {
583
        if (led_count == 0) {
584
          mLED_1_green_Toggle();
585
          mLED_1_red_Off();
586
        }//end if
587
      }
588
      else if (USBDeviceState == CONFIGURED_STATE) {
589
        if (led_count==0) {
590
          mLED_1_green_Toggle();
591
          if (mGetLED_1_green()) {
592
            mLED_1_red_Off();
593
          }
594
          else {
595
            mLED_1_red_On();
596
          }
597
        }//end if
598
      }
599
    }
600
#endif
601
}//end BlinkUSBStatus
602
603
void USBCBSuspend(void)
604
{
605
    //Example power saving code.  Insert appropriate code here for the desired
606
    //application behavior.  If the microcontroller will be put to sleep, a
607
    //process similar to that shown below may be used:
608
    
609
    //ConfigureIOPinsForLowPower();
610
    //SaveStateOfAllInterruptEnableBits();
611
    //DisableAllInterruptEnableBits();
612
    //EnableOnlyTheInterruptsWhichWillBeUsedToWakeTheMicro();  //should enable at least USBActivityIF as a wake source
613
    //Sleep();
614
    //RestoreStateOfAllPreviouslySavedInterruptEnableBits();  //Preferrably, this should be done in the USBCBWakeFromSuspend() function instead.
615
    //RestoreIOPinsToNormal();                  //Preferrably, this should be done in the USBCBWakeFromSuspend() function instead.
616
617
    //IMPORTANT NOTE: Do not clear the USBActivityIF (ACTVIF) bit here.  This bit is 
618
    //cleared inside the usb_device.c file.  Clearing USBActivityIF here will cause 
619
    //things to not work as intended.  
620
    
621
622
    #if defined(__C30__)
623
    #if 0
624
        U1EIR = 0xFFFF;
625
        U1IR = 0xFFFF;
626
        U1OTGIR = 0xFFFF;
627
        IFS5bits.USB1IF = 0;
628
        IEC5bits.USB1IE = 1;
629
        U1OTGIEbits.ACTVIE = 1;
630
        U1OTGIRbits.ACTVIF = 1;
631
        Sleep();
632
    #endif
633
    #endif
634
}
635
636
#if 0
637
void __attribute__ ((interrupt)) _USB1Interrupt(void) {
638
  #if !defined(self_powered)
639
     if (U1OTGIRbits.ACTVIF) {
640
       IEC5bits.USB1IE = 0;
641
       U1OTGIEbits.ACTVIE = 0;
642
       IFS5bits.USB1IF = 0;
643
        
644
       //USBClearInterruptFlag(USBActivityIFReg,USBActivityIFBitNum);
645
         USBClearInterruptFlag(USBIdleIFReg,USBIdleIFBitNum);
646
       //USBSuspendControl = 0;
647
     }
648
  #endif
649
}
650
#endif
651
652
653
void USBCBWakeFromSuspend(void)
654
{
655
    // If clock switching or other power savings measures were taken when
656
    // executing the USBCBSuspend() function, now would be a good time to
657
    // switch back to normal full power run mode conditions.  The host allows
658
    // a few milliseconds of wakeup time, after which the device must be 
659
    // fully back to normal, and capable of receiving and processing USB
660
    // packets.  In order to do this, the USB module must receive proper
661
    // clocking (IE: 48MHz clock must be available to SIE for full speed USB
662
    // operation).
663
}
664
665
void USBCB_SOF_Handler(void) {
666
  // No need to clear UIRbits.SOFIF to 0 here.
667
  // Callback caller is already doing that.
668
}
669
670
void USBCBErrorHandler(void) {
671
  // No need to clear UEIR to 0 here.
672
  // Callback caller is already doing that.
673
674
    // Typically, user firmware does not need to do anything special
675
    // if a USB error occurs.  For example, if the host sends an OUT
676
    // packet to your device, but the packet gets corrupted (ex:
677
    // because of a bad connection, or the user unplugs the
678
    // USB cable during the transmission) this will typically set
679
    // one or more USB error interrupt flags.  Nothing specific
680
    // needs to be done however, since the SIE will automatically
681
    // send a "NAK" packet to the host.  In response to this, the
682
    // host will normally retry to send the packet again, and no
683
    // data loss occurs.  The system will typically recover
684
    // automatically, without the need for application firmware
685
    // intervention.
686
    
687
    // Nevertheless, this callback function is provided, such as
688
    // for debugging purposes.
689
}
690
691
void USBCBCheckOtherReq(void) {
692
  USBCheckHIDRequest();
693
}//end
694
695
696
void USBCBStdSetDscHandler(void) {
697
  // Must claim session ownership if supporting this request
698
}//end
699
700
701
void USBCBInitEP(void) {
702
  //enable the HID endpoint
703
  USBEnableEndpoint(HID_EP,USB_IN_ENABLED|USB_OUT_ENABLED|USB_HANDSHAKE_ENABLED|USB_DISALLOW_SETUP);
704
  //Re-arm the OUT endpoint for the next packet
705
  USBOutHandle = HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64);
706
}
707
708
709
 *******************************************************************/
710
void USBCBSendResume(void) {
711
  static WORD delay_count;
712
    
713
  USBResumeControl = 1;                // Start RESUME signaling
714
    
715
  delay_count = 1800U;                // Set RESUME line for 1-13 ms
716
  do {
717
    delay_count--;
718
  } while(delay_count);
719
  USBResumeControl = 0;
720
}
721
722
BOOL USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, WORD size) {
723
  switch(event) {
724
    case EVENT_CONFIGURED: 
725
      USBCBInitEP();
726
      break;
727
    case EVENT_SET_DESCRIPTOR:
728
      USBCBStdSetDscHandler();
729
      break;
730
    case EVENT_EP0_REQUEST:
731
      USBCBCheckOtherReq();
732
      break;
733
    case EVENT_SOF:
734
      USBCB_SOF_Handler();
735
      break;
736
    case EVENT_SUSPEND:
737
      USBCBSuspend();
738
      break;
739
    case EVENT_RESUME:
740
      USBCBWakeFromSuspend();
741
      break;
742
    case EVENT_BUS_ERROR:
743
      USBCBErrorHandler();
744
      break;
745
    case EVENT_TRANSFER:
746
      Nop();
747
      break;
748
      default:
749
      break;
750
  }      
751
  return TRUE; 
752
}
753
754
/** EOF main.c *************************************************/
755
#endif

Mir geht Hauptsächlich um die USB Funktionen, ob die überhaupt wichtig 
sind.

In diesem Code sind bestimmt sehr viele Leichen.
Wenn es nach mir geht werde ich alle neu schreiben und allermal von 
diesem USB Geschichte weg aber es lag nicht in meine Hand für so was zu 
entscheiden bzw. ich wurde immer gebremmst.....

von Volker S. (vloki)


Lesenswert?

Wenn das ein USB Gerät sein soll, dann lass den USB Teil einfach so wie 
er ist. Sicher kann man da einiges entfernen, aber ohne sehr genaues 
Wissen was man tut, wird das schnell im Desaster enden!

Was man unbedenklich entfernen kann wäre z.B.
BlinkUSBStatus() und die ganzen #if defined(PIC24FJ2... Sachen, die 
definitiv nicht zu deinem Controller passen.
Den ganzen Bootloader Stuff kann man natürlich auch weg lassen, wenn 
nicht die Absicht besteht die Firmware im Feld mittels eines Bootlaoders 
updatebar zu machen. Die Ganze Arbeit das alles zu entfernen lohnt aber 
meiner Meinung nach die Mühe nicht!



Der Code, der sich auf dein Projekt bezieht, ist eigentlich komplett in 
den Funktionen
- void UserInit(void)
- void ProcessIO(void)
enthalten.

- InitPort(); i2c_init(); i2c_confChips();
gehören wohl auch in UserInit()

ucfuLrcChecksum() und das Watchdog Zeug stammt wohl auch nicht aus dem 
Original Demo-Projekt

Wenn du das ganze neu schreiben willst (vermutlich die beste Idee), dann 
nimm als Grundlage die neueste Version des HID Demo Projektes aus den 
MAL (Microchip Libraries for Applications). Dann musst du aber den XC8 
Compiler verwenden!

Das am besten passende Projekt für einen 18Fx550 ist aktuell dieses:
.../mla/v2017_03_06\apps\usb\device\hid_custom\firmware\picdem_fs_usb.x



Alternativ könntest du auch meine Version benutzen, in der ich schon 
einiges weg gekürzt habe und die mit C18 und XC8 kompilierbar sein 
sollte.
Ich habe das mal gemacht, weil die früheren Versionen der Demo Projekte 
extrem unübersichtlich waren, weil es nur ein Projekt mit sehr vielen 
verschiedenen Konfigurationen für alle möglichen PICs (8..32bit) und 
Demo- Boards gab.
Inzwischen wurde das aber geändert und es gibt in jedem Projekt nur noch 
eine Konfiguration. Jetzt sind die MCHP Demos für Anfänger eigentlich 
noch einfacher zu verwenden als meine Version ;-)

PS: solch umfangreichen Code würde ich als Anhang...

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Das am besten passende Projekt für einen 18Fx550 ist aktuell dieses:
> .../mla/v2017_03_06\apps\usb\device\hid_custom\firmware\picdem_fs_usb.x

Wo finde ich das bitte?

von Volker S. (vloki)


Lesenswert?

MLA installieren?
(wenn du es nicht suchst, dann findest du es überhaupt nicht ;-)

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

jetzt schon
Danke :-)

von Saheb (Gast)


Lesenswert?

Um mit der PIC18F4550 zu kommunizieren, wird einen HID class.DLL 
gebraucht.
Dieses HID class.DLL weiss ich immer noch nicht woher?
Es wird immer benutzt und keine mensch weiss woher?
Mittlerweile weiss ich. Es stammt von Microship aber als Demozweck.

Meine Frage an dich, weiss du bitte vielleicht wo kann ich die Source 
Code bekommen damit ich die neue erstellen und zwar mit der richtige 
"aktuell" Framework.


Problem ist:
Dieses HID Class.DLL wurde in C# geschrieben und mit der 2.0 Framework 
erstellt.
Unter Visual Studio 2008 C++ war ein Problem (Es passiert, dass die USB 
Kommunikation abgebrochen wird)aber nicht so instabil wie in Visual 
studio 2015 ist.

Um das überhaupt unter Visual studio 2015 zum laufen zu bekommen, muss 
es extra eine .conf datei geschrieben um die ganze Application mit einem 
bestimmten Framework z.B 4.6 zu zwingen.

SW extra zu flicken und warten, dass es alles gut geht ist sehr 
gefährlich.

von Volker S. (vloki)


Lesenswert?

Da brauch man nicht unbedingt eine dll dafür.

Ich habe meine Qt Anwendung mit der HID-API von Alan Ott realisiert
http://www.hs-ulm.de/nocache/wir/Personal/PersonalSaSchr/vschilli/QtProjekte/

ältere Screenshots:
http://picforum.ric323.com/viewtopic.php?f=46&t=103#p745

Die HID-API kann man natürlich auch in VS C++ verwenden.

: Bearbeitet durch User
von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Ich wollte deine Qt5-HID_20141103.zip testen.
Ich benutze der Qt Creator Version 4.0.2.

Fehlermeldung:
App.rc does not exist (seh bitte Anhang)

von Volker S. (vloki)


Lesenswert?

Kommentiere das einfach im Projektfile aus...
(Braucht man nicht, ist nur für das Icon der exe)

Blöde Frage: Warum nicht Source_HID_20150806?

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

ja Okay Danke
In deinem qcustomplot.h bzw. qcustomplot.cpp muss ich auch was 
includieren und dazu was einrichten oder?

von Volker S. (vloki)


Lesenswert?

Yo, steht ja in den Dateien drin ;-)

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Volker,

beim ausprobieren deinen Beispiel in Qt Creator zu starten haben ich 
folgende Link Problem(Seh bitte Anhang).


Was muss ich machen, damit ich dieses Linksproblem umgehe?
danke

von Volker S. (vloki)


Lesenswert?

Keine Ahnung warum ich das da hin kopiert haeb. Ist zu lange her ;-)
Die Datei solle im Qt Installationsordner zu finden sein. Bei mir:

...\Qt5.4.1\Tools\mingw491_32\i686-w64-mingw32\lib

von Saheb (Gast)


Lesenswert?

Was für Datei: "libsetupapi.a"?

von Volker S. (vloki)


Lesenswert?

Nein die Datei: "bloedefrage.txt" ;-)

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Ich habe Qt 5.7 und finde diese Datei nicht?

von Saheb (Gast)


Lesenswert?

aber was ist für einen Datei "libsetupapi"?

von Volker S. (vloki)


Lesenswert?

Kann mich nicht mehr erinnern, wozu man die überhaupt braucht.
Kommentiere das mal im Projektfile aus. Scheint trotzdem zu laufen...

von Saheb (Gast)


Lesenswert?

ja es funktioniert

von Volker S. (vloki)


Lesenswert?

Kann sein, dass man die Bibliothek bei früheren Qt Versionen noch 
gebraucht hat und ich gar nicht gemerkt habe, dass sie jetzt überflüssig 
ist.
Hatte auf jeden Fall mit den Aufrufen der  SetupDiGet...() Funktionen in 
den HID.c zu tun.

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Hast du versucht das Projekt "Pro Datei" mit Visual Studio 2015  zu 
Öffnen?

von Volker S. (vloki)


Lesenswert?

Nein, ich benutze kein VS.

von Saheb (Gast)


Lesenswert?

Hallo Volker,


ich versuche gerade mithilfe deinen "LPC_FSUSB-HID-X-r4a.zip" in meinen 
Projekt anzupassen.
Ich nehme einen Beispiel"Firmware":
Bei dir in der Main Funktion:
1
MAIN_RETURN main(void)
2
{
3
.....
4
        // Application-specific tasks.
5
        APP_CustomHIDTasks();
6
}
wird die Funktion APP_CustomHIDTasks() aufgerufen, die wiederum in der 
"app_custom_hid.c" implementiert und die wiederum in
1
APP_usbOUT(); // Data USB(pc) -> PIC
oder
1
 APP_usbIN();
Mich interessiert, die beide Zeilen:
1
 USBInHandle = HIDTxPacket(HID_EP,(uint8_t *)ToSendDataBuffer, 64);// bei APP_usbIN();
2
//und
3
USBOutHandle = HIDRxPacket(HID_EP,(uint8_t*)&ReceivedDataBuffer,64);
Was machst du hier ?

von Saheb (Gast)


Lesenswert?

In dem Projekt, der ich habe ist so vorgegangen worden.

In der main Datei:
#define LED_ON            0x20
#define Firmware_version  0x28

#define MAJOR_VERSION 5
#define MINOR_VERSION 9
...
Jede Commando ist mit diesem Makro "#define" definiert
dann in der main Funktion:
1
#if defined(__18CXX)
2
void main(void)
3
#else
4
int main(void)
5
#endif
6
{   
7
8
    InitializeSystem();
9
10
11
12
    #if defined(USB_INTERRUPT)
13
        USBDeviceAttach();
14
    #endif
15
16
17
  //vfuTestWatchdog();
18
19
    while(1)
20
    {
21
22
        #if defined(USB_POLLING)
23
         APP_CustomHIDTasks();
24
}
25
}
die  APP_CustomHIDTasks() ist so implementiert:
1
 void APP_CustomHIDTasks()
2
{
3
    ....
4
     if (!HIDRxHandleBusy(USBOutHandle)) 
5
    {
6
         switch(ReceivedDataBuffer[0]) 
7
        {
8
          case LED_ON:
9
           ToSendDataBuffer[2] = 1;
10
           ReceivedDataBuffer[2] = 1;
11
           break;
12
           case Firmware_version:
13
           ToSendDataBuffer[2] = MAJOR_VERSION;
14
           ToSendDataBuffer[3] = MINOR_VERSION;
15
           break;
16
           ......
17
         }
18
         }
19
    USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
20
    USBOutHandle = HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64);
21
            
22
23
}

von Volker S. (vloki)


Lesenswert?

Das sind Macros aus dem MCHP USB Framework
-> irgendeine_installierte_MLA_Version -> .../doc/help_mla_usb.xxx

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> In dem Projekt, der ich habe ist so vorgegangen worden...
Dein Projekt basiert lediglich auf einer älteren Version des HID custom 
demo Projektes.

z.B.
Saheb schrieb:
> Jede Commando ist mit diesem Makro "#define" definiert
In neueren Version sind die Kommandos als enum angelegt. Das mach hier 
praktisch keinen Unterschied.


Die zusätzliche Trennung in Funktionen für APP_usbOUT() und APP_usbIN() 
habe ich implementiert, weil bei meinen Projekten auch usbIn Transfers 
vorkommen die KEINE Antwort auf einen vorhergehenden usbOUT Transfer 
sind, sondern z.B Datenpakete vom kontinuierlich messenden ADC. Also 
einmal ein Kommando zum Starten der Messung (usbOUT) und eben immer dann 
Daten (usbIN), wenn ein Paket voll ist.

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Soll ich vielleicht eine Änderung vornehmen deine Meinung nach?


Eine andere Frage: Lohnt es sich eine PIC32 zu nehmen, die die gleiche 
Eingenschaften hat wie eine Pic18F?

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Soll ich vielleicht eine Änderung vornehmen deine Meinung nach?

Falls das Projekt längerfristig weiter entwickelt wird, dann sollte man 
auf die neueste Version des Frameworks umsteigen. Wenn nur ein kleiner 
Zusatz programmiert werden soll, dann eher nicht. (ausser ihr habt sonst 
nichts zu tun ;-)

Saheb schrieb:
> Eine andere Frage: Lohnt es sich eine PIC32 zu nehmen, die die gleiche
> Eingenschaften hat wie eine Pic18F?
Woher soll das irgend jemand wissen, der keine Ahnung von den 
Anforderungen des Projektes hat?
Ohne grosse Änderungen könnte man vermutlich einen 18F45K50 nehmen. Der 
sollte billiger sein.
Wie kommst du auf die Idee mit dem PIC32?
Auch schon daran gedacht einen 16F1459 zu nehmen?

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Wie kommst du auf die Idee mit dem PIC32?
Einfach um mehr Leistung zu schaffen.
Die Abtastrate ist auch eine wichtige Kriterium für uns und aus diesem 
grund habe ich an PIC32 bzw. die Überlegung auch an eine STM32.
> Auch schon daran gedacht einen 16F1459 zu nehmen?
Nein wenn einen neues Mikrocontroller sein muss, dann muss mindesten 
eine 32Bit sein.

von Volker S. (vloki)


Lesenswert?

1. Braucht ihr die Leistung wirklich?
2. Die Bandbreite zur Übermittlung von Daten über HID ist nicht sehr 
hoch.
   (Die kann auch ein 8bit Controller locker auslasten ;-)

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> 1. Braucht ihr die Leistung wirklich?
> 2. Die Bandbreite zur Übermittlung von Daten über HID ist nicht sehr
> hoch.

Wir sind seit 10 Jahre mit diesem Pic und ich denke der Zeitpunkt ist 
schon gekommen davon zu verabschieden.

Die SW ist auf drei schichten aufgebaut:
1)FW
2)DLL (Algorithmen)
3) View Schicht

Wir wollen auch gerne der 1 und der zweite Schicht in einem schicht 
haben.
IstStand:
Die SW ist aus Mischmaschi gebaut also eine durchgehende Änderung ist 
ein Muss.
Es ist eine Entwicklung, die es nicht von heute auf morgen geht aber 
wenn es langfristig gedacht dann muss die SW genau wie die HW von vorne 
an überlegt werden.

was mir auch in diesem Projekt stört, dass es zwischen die Hardware (FW) 
und die DLL(Algorithem) einen HID Class.dll benutzt wird was wirklich 
mit sich sehr viele Probleme mitbringt.

von Volker S. (vloki)


Lesenswert?

Ich kann mir als Außenstehender leider nicht recht vorstellen was diese 
Schicht DLL(Algorithmen) so macht ;-)

Ich habe auf meinem Rechner 8 Versionen der MLA von 2013..2017 und die 
einzige welche diese HID class.dll enthält, ist die älteste v2013_06_15.

Da mich grundsätzlich nur Cross-Platfform taugliche Beispiele 
interessieren
...mla\v2017_03_06\apps\usb\device\hid_custom\utilities\plug_and_play_ex 
ample\cross_platform...
habe ich bisher aber auch nur die HID-API von Alan Ott verwendet.

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

wenn ich auf die die HID Class.dll verzichte und stadessen mich um deine 
Demo mich orientiere, muss ich auch was ändern auf die FW Seite?

In der FW seite sind die Commandos so dekalariert:
1
......
2
#define FIRMWARE_VERSION       0x08
3
#define RESET_DEVICE           0xFE
4
#define MODE_CHANGE            0xFD
5
#define TEST_WATCHDOG          0xFF
6
#define TEST_MODE              0x30
7
...
Danke in voraus

von Volker S. (vloki)


Angehängte Dateien:

Lesenswert?

Da musst du erst mal gar nichts ändern. Die PC Software funktioniert auf 
dem TAB Terminal auch wie ein solches.

Die Nummer deines USB Gerätes auswählen und Connect klicken.

Wenn es funktioniert hat, schreibst du dein Kommando (z.B. 08) in eine 
der vier Zeilen links neben den HEX OUT Buttons und klickst den Button 
oder drückst die entsprechende Funktionstaste.

Die Antwort deines Gerätes wird dann in den zwei Fenstern darunter 
angezeigt.

von Saheb (Gast)


Lesenswert?

Hi,

danke es funktioniert.

In der Firmware (deine bzw in meine Projekt) sehe ich stets
1
ReceivedDataBuffer

Ich frage mich wie bekommt man der Value dieses Array?

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Ich frage mich wie bekommt man der Value dieses Array?

? Vermutlich verstehe ich die Frage nicht ;-)


Saheb schrieb:
> USBOutHandle = HIDRxPacket(HID_EP,(uint8_t*)&ReceivedDataBuffer,64);
Volker S. schrieb:
> Das sind Macros aus dem MCHP USB Framework
> -> irgendeine_installierte_MLA_Version -> .../doc/help_mla_usb.xxx


...
Saheb schrieb:
> switch(ReceivedDataBuffer[0])

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

aber das wird erst später aufgerufen
Volker S. schrieb:
> USBOutHandle = HIDRxPacket(HID_EP,(uint8_t*)&ReceivedDataBuffer,64);
 z.B in deinem Projekt bei der Funktion:
1
void APP_cmd(void) 
2
{
3
...
4
switch (ReceivedDataBuffer[1]) {
5
..        case CID_DEVICE: // send device identification string
6
            ToSendDataBuffer[1] = CID_DEVICE | ID_MESSAGE;
7
            ToSendDataBuffer[0] = sizeof (strDevice) + 1;
8
            .....
9
10
}
Wo deklarierst, dass die Daten, die von der USB verbindung kommen 
ReceivedDataBuffer heissen?


Danke

von Volker S. (vloki)


Angehängte Dateien:

Lesenswert?

Was genau in der Doku verstehst du nicht?

von Saheb (Gast)


Lesenswert?

Es hat sich geklärt.


Das machst du hier:
1
#if defined(FIXED_ADDRESS_MEMORY)
2
  #if defined(__XC8)
3
    unsigned char ReceivedDataBuffer[64] @ HID_CUSTOM_OUT_DATA_BUFFER_ADDRESS;
4
    unsigned char ToSendDataBuffer[64] @ HID_CUSTOM_IN_DATA_BUFFER_ADDRESS;
5
  #elif defined(COMPILER_MPLAB_C18)
6
    #pragma udata HID_CUSTOM_OUT_DATA_BUFFER = HID_CUSTOM_OUT_DATA_BUFFER_ADDRESS
7
    unsigned char ReceivedDataBuffer[64];
8
    #pragma udata HID_CUSTOM_IN_DATA_BUFFER = HID_CUSTOM_IN_DATA_BUFFER_ADDRESS
9
    unsigned char ToSendDataBuffer[64];
10
    #pragma udata
11
  #endif
12
#else
13
  unsigned char ReceivedDataBuffer[64];
14
  unsigned char ToSendDataBuffer[64];
15
#endif
Danke

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Es hat sich geklärt.

Nein, das ist was anderes ;-)

von Saheb (Gast)


Lesenswert?

Das verstehe ich schon aber ich glaube wir reden an einander vorbei.
Es hat sich aber geklärt.

von Saheb (Gast)


Lesenswert?

aber du muss irgendwie sagen die Daten, die von der USB bekomme heissen 
"ReceivedDataBuffer"

von Saheb (Gast)


Lesenswert?

Sorry Sorry
du hast vollkommen recht:

was ich meine ist das:
1
void APP_CustomHIDInitialize()
2
{
3
....
4
USBOutHandle = (volatile USB_HANDLE)HIDRxPacket(HID_EP,(uint8_t*)&ReceivedDataBuffer,64);
5
6
}

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> aber du muss irgendwie sagen die Daten, die von der USB bekomme heissen
> "ReceivedDataBuffer"

Sieh es mal so:
Es wird irgendwo ein Array angelegt das ReceivedDataBuffer[] heißt und 
dem USB Modul wird über das Makro mitgeteilt, dass die an einem 
speziellen Endpunkt ankommenden Daten genau da rein geschrieben werden 
sollen.

Das Makro gibt ein Handle zurück, mit dessen Hilfe überprüft werden 
kann, ob ein Paket angekommen ist und verarbeitet werden kann
1
if(!HIDRxHandleBusy(USBOutHandle))

Wenn ein Paket empfangen und gegebenenfalls verarbeitet wurde, muss dem 
USB Modul wieder mitgeteilt werden, dass der Speicherbereich wieder für 
ein zukünftig ankommendes Paket benutzt werden kann/soll.
Darum steht am Ende der Verarbeitung wieder das Makro...
1
/*******************************************************************************
2
 * Function:        usbOUT(void)
3
...
4
 *
5
 * Overview:        Data USB(pc) -> PIC
6
...
7
******************************************************************************/
8
9
void APP_usbOUT(void) {
10
11
    APP_cmd();
12
13
    //Re-arm the OUT endpoint for the next packet
14
    USBOutHandle = HIDRxPacket(HID_EP,(uint8_t*)&ReceivedDataBuffer,64);
15
}


Das FIXED_ADDRESS_MEMORY Zeug ist nochmal eine andere Geschichte und 
kommt daher, dass bei den älteren PICs das USB-Modul nur auf bestimmte 
Bereiche des RAMs Zugriff hat. -> Datasheet

von Saheb (Gast)


Lesenswert?

Herzlichen dank für die ausführliche Antwort

von Saheb (Gast)


Lesenswert?

Hallo Volker,


Ich habe es mit deinem HID-Demo rumgespielt.
Was ich gemerkt habe ist: Bei bestimmten Commandos bleibt die HID-Demo 
SW hängen.
Technisch: Die
1
hid_write(hid_device *dev, const unsigned char *data, size_t length)
liefert keine Antwort zurück.
Und wenn ich das Programm beende und neue starten, wird trotzdem die USB 
Verbindung nicht gefunden.
In diesem Fall hilft nur die USB Kabel kurz auszustecken und wieder 
einzustecken, dann wird die USB Verbindung gefunden.

von Volker S. (vloki)


Lesenswert?

Was meinst du jetzt genau?
PC Software, Firmware oder beides?

Welche bestimmten Kommandos?

Wenn du das alles gleich geschrieben hättest,
wüsste ich jetzt vermutlich schon die Antwort auf das Problem ;-)

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Was meinst du jetzt genau?
> PC Software, Firmware oder beides?
Pc SW
>
> Welche bestimmten Kommandos?
>
z.B in meine Firmware das Kommando:23 heisst Messung Signalperiode.

von Volker S. (vloki)


Lesenswert?

Vielleicht misst dein Gerät einfach nur seeeehr lange bis es eine 
Antwort schickt ;-)

von Saheb (Gast)


Lesenswert?

Eigentlich nicht.

Dieses Effekt tritt, wenn ich z.B das Kommandos 23 drei mal wiederhole.
Bei ersten mal ist gut
beim zweiten mal ist auch gut
Und beim dritten mal bekomme ich keine Antwort und die SW(PC SW)bleibt 
hängen.

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Und beim dritten mal bekomme ich keine Antwort und die SW(PC SW)bleibt
> hängen.

Soll heißen das Programm bleibt in der Funktion hid_write() hängen oder 
was?

Saheb schrieb:
> Technisch: Diehid_write(hid_device *dev, const unsigned char *data,
> size_t length)
> liefert keine Antwort zurück.

Immer beim dritten mal?
Dann wurde das Gerät vielleicht mit dem zweiten Kommando abgeschossen.

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Soll heißen das Programm bleibt in der Funktion hid_write() hängen oder
> was?

Ja die FKT hid_write()wird ne beendet aber sobald die USB Verbindung 
kurs aus/eingestekt  dann wird beendet.

Volker S. schrieb:
> Immer beim dritten mal?
Ja
> Dann wurde das Gerät vielleicht mit dem zweiten Kommando abgeschossen

Die ist schon beim zweiten Kommando abgeschossen aber beim zweiten 
Kommandos kann es die FKT "hid_write()" mindesten aufgereufen aber beim 
dritten bleibt es hängen.

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Die ist schon beim zweiten Kommando abgeschossen aber beim zweiten
> Kommandos kann es die FKT "hid_write()" mindesten aufgereufen aber beim
> dritten bleibt es hängen.

Das heißt, beim dritten mal kannst du auch ein anderes Kommando ( nicht 
mehr ;-) schicken?

Oder wenn einmal 23 geschickt wurde, dann kann man noch ein einziges 
weiteres/anderes Kommando abschicken und bei jedem weiteren Versuch ist 
Ende?

Tja, da solltest du wohl mal die Firmware deines Gerätes mit dem 
Debugger untersuchen...

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Das heißt, beim dritten mal kannst du auch ein anderes Kommando ( nicht
> mehr ;-) schicken?

Ja

Volker S. schrieb:
> Oder wenn einmal 23 geschickt wurde, dann kann man noch ein einziges
> weiteres/anderes Kommando abschicken und bei jedem weiteren Versuch ist
> Ende?

Warum?
Aber es muss doch möglich sein, dieses Kommandos beliebig abzufragen und 
es spricht nicht dagegen

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> und es spricht nicht dagegen

Deine Firmware?

BTW: Beantworte bitte noch die Frage:

Volker S. schrieb:
> Oder wenn einmal 23 geschickt wurde, dann kann man noch ein einziges
> weiteres/anderes Kommando abschicken und bei jedem weiteren Versuch ist
> Ende?

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Deine Firmware?

Ja

Volker S. schrieb:
>> Oder wenn einmal 23 geschickt wurde, dann kann man noch ein einziges
>> weiteres/anderes Kommando abschicken und bei jedem weiteren Versuch ist
>> Ende?

Das Kommando 23 muss belibig oft abgeschcikt werden ohne Begrenzung

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Das Kommando 23 muss belibig oft abgeschcikt werden ohne Begrenzung

Das ist keine Antwort auf meine Frage!
Ich habe danach gefragt, wie es ist und nicht wie es sein soll!

Kommt überhaupt eine Antwort auf das Kommando 23?




Volker S. schrieb:
> Saheb schrieb:
>> und es spricht nicht dagegen
>
> Deine Firmware?

Soll heißen: "deine/eure Firmware spricht dagegen" ;-)

: Bearbeitet durch User
von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

Volker S. schrieb:
> Kommt überhaupt eine Antwort auf das Kommando 23?

ja

von Volker S. (vloki)


Lesenswert?

Das ist aber eine lange Antwort für eine Signalperiode.

Auf das nächste Kommando (egal welches) kommt dann keine Antwort mehr?

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Auf das nächste Kommando (egal welches) kommt dann keine Antwort mehr?

Nein
SW(PC SW) bleibt hängen

von Volker S. (vloki)


Lesenswert?

Na, oben hast du behauptet, die Software bleibt beim dritten Kommando 
hängen. Jetzt schon beim zweiten. Was denn nun GENAU?


-------------------------------------------------------------------
PS:
Die Länge der Antwort ist vermutlich viel kürzer.

Das kommt wohl davon, dass ich in meinem Beispiel das erste Byte 
inBuffer[0] für eine Info benutze, wie viele gültige Daten-Bytes 
kommen. (es kommt immer ein komplettes Paket mit 64, die aber nicht alle 
etwas vernünftiges enthalten)

Antwort 0x23 wird von der SW interpretiert als 35 gültige Daten und so 
viele werden angezeigt.
1
io_result = hid_read(connected_device, inBuffer, 65);
2
3
    if (io_result == 64){
4
...
5
        for (int i = 0; i<= inBuffer[0];i++){
6
            s += QString("%1").arg(inBuffer[i],3,16);
7
        }
8
        ui->teInHEX->append(s);

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Was denn nun GENAU?

z.B:
folgende vorgehen:
1)Beim Kommando: 8
überhaupt kein Problem. Kommandos kann öfter wiederholt werden
Antwort ist immer korrekt.

2)Beim Kommando: 23
Nur Kommando 23
Beim ersten mal Durchführung --> richtig ausgeführt
Beim zweiten mal auch --> richtig ausgeführt
Beim dritten mal --> SW bleibt hängen

3) Kommando: 8
@ richtig ausgeführt
Kommando: 23
@ richtig ausgeführt
Kommando: 8
SW (PC SW) bleibt hängen

von Saheb (Gast)


Angehängte Dateien:

Lesenswert?

In Debug Modus:
Beim folgende Codeabschnitt:
1
 for (int i = 0; i<= inBuffer[0];i++){
2
   s += QString("%1").arg(inBuffer[i],3,16);
3
  }
Beim Kommando 23 und 8 sieht der inBuffer wie folgende aus (Seh bitte 
Anhang).

von Volker S. (vloki)


Lesenswert?

Saheb schrieb:
> Beim Kommando 23 und 8 sieht der inBuffer wie folgende aus (Seh bitte
> Anhang).

Es ist egal, wie der Buffer aussieht. Wichtig ist nur die Information, 
dass im Buffer nicht unbedingt was sinnvolles drin steht!

DU musst irgendwie wissen, wie die Antwort aussieht, bzw. wie lang sie 
wirklich ist.




Zum Thema hängen bleiben:
Ich nehme an das Kommando 23 schießt den uC ab und er reagiert nicht 
mehr.

Das kannst du sehr einfach überprüfen.
Kommando 23 schicken und dann disconect. Wenn das Gerät dann nicht 
wieder oben in der Liste auftaucht, ist es tot! (wurde es vom Kommando 
23 gekillt)

Zweite Möglichkeit:
In der Firmware einen Breakpoint auf die Verarbeitung von Kommando 8.
Zuerst Kommando 23 schicken und dann 8. Wird der Breakpoint nicht 
erreicht...

von Saheb (Gast)


Lesenswert?

Volker S. schrieb:
> Das kannst du sehr einfach überprüfen.
> Kommando 23 schicken und dann disconect. Wenn das Gerät dann nicht
> wieder oben in der Liste auftaucht, ist es tot! (wurde es vom Kommando
> 23 gekillt)

Ja das stimmt Kommando 23 ist gekillt.

von Saheb (Gast)


Lesenswert?

Das Kommando 23 hat die USB Verbindung gekillt, weil es von der (PC SW) 
Inhalte fehlen.

Um das Kommando 23 korrekt auszuführen muss man noch 2 DatenValue 
"ReceivedDataBuffer[2] und ReceivedDataBuffer[3] " mitschicken (mein 
Fehler).
Volker das kannst du nicht wissen.
Jetzt, wenn ich die beiden Values der ReceivedDataBuffer[2] bzw. der 
ReceivedDataBuffer[3] korrekt mitschicke, dann läuft alles wie es sein 
muss.
(HID-Demo "PC SW") wird nicht mehr hängen bleiben.

von Volker S. (vloki)


Lesenswert?

Das darf nie passieren! In einem solchen Fall muss das Gerät mit einer 
Fehlermeldung antworten und natürlich weiter funktionieren!

: Bearbeitet durch User
von Saheb (Gast)


Lesenswert?

Hallo Volker,


kennst du dich mit STM32 aus?

von Volker S. (vloki)


Lesenswert?

Nö ;-)

von Saheb (Gast)


Lesenswert?

Schade

Das hatte sein können

von Saheb (Gast)


Lesenswert?

Kennst du dich aus mit FPGA ?

von Witkatz :. (wit)


Lesenswert?

@Saheb: bitte, registriere dich endlich mal, dann kannst du eine private 
Unterhaltung mit Volker weiter per PN führen. Er hat zwar (wieder mal) 
eine auserordentliche Geduld und Hilfsbereitschaft gezeigt, aber es gibt 
noch zig tausend andere Forumnutzer. Einige von denen können und wollen 
dir bei konkreten Fragen zu STM32 oder FPGA helfen, aber bitte in 
separaten, neuen Threads ggf. im entspr. Unterforum.

von Saif K. (saif_k58) Flattr this


Lesenswert?

Hallo Volker,


Darf ich in MPLAB X IDE so was schreiben?
1
  int ADR_DATA[64][4];
2
  int ROM[8][4];

Wenn ich so schreibe und meine Prog kompiliere da bekomme ich stets eine 
Fehlermeldung:
Error [1300] Stack frame too large


Danke

von Volker S. (vloki)


Lesenswert?

Ich nehme jetzt mal an, die Variablen sind lokal und der Stack ist im 
C18 Linker Skript wie groß definiert?

Stellt sich die Frage: Sollen die Variablen lokal sein?

PS: DAS wäre im XC8 Compiler anders/besser gelöst...
PPS: Hat mit der IDE natürlich genau gar nichts zu tun ;-)

: Bearbeitet durch User
von Saif K. (saif_k58) Flattr this


Angehängte Dateien:

Lesenswert?

Volker S. schrieb:
> Ich nehme jetzt mal an, die Variablen sind lokal und der Stack ist im
> C18 Linker Skript wie groß definiert?

Ja
Es handelt sich um lokale Variablen."Seh bitte Anhang"

> Stellt sich die Frage: Sollen die Variablen lokal sein?
Wenn die Variable nur in eine Funktion gebraucht ist, dann muss es 
lokale definiert sein oder muss ich die jetzt globale definieren um 
diese Error umzugehen?

> PS: DAS wäre im XC8 Compiler anders/besser gelöst...
Das muss ich sowiso tun. Das ganze in XC8 integrieren.

Danke in voraus

von Saif K. (saif_k58) Flattr this


Lesenswert?

Ich habe es jetzt die beiden Variablen
1
int ADR_DATA[64][4];
2
int ROM[8][4];
 globale definiert dann bekomme jetzt eine andere Fehlermeldung:
1
Error [1131] type mismatch in assignment

Meine Funktion sieht so aus:
1
void Get_ROM_Content(unsigned char *paucRomContent_p) 
2
{
3
  char chAdr_l;
4
  unsigned char ucRomVal;
5
  unsigned char ucMsk_l;
6
  unsigned char ucRomRead_l;
7
8
  int Data[4];
9
//  int ADR_DATA[64][4];
10
//  int ROM[8][4];
11
    int i= 0;
12
13
  for (i = 0; i < 64; i++)
14
    {
15
    if (i % 9 == 0)
16
        {
17
      Data[0] = 8 ;
18
      Data[1] = 4;
19
      Data[2] = 2;
20
      Data[3] = 1;
21
    }
22
    else 
23
        {
24
      Data[0] = 0;
25
      Data[1] = 0;
26
      Data[2] = 0;
27
      Data[3] = 0;
28
    }
29
    ADR_DATA[i][0] = (i << 4) | Data[0];
30
    ADR_DATA[i][1] = (i << 4) | Data[1];
31
    ADR_DATA[i][2] = (i << 4) | Data[2];
32
    ADR_DATA[i][3] = (i << 4) | Data[3];
33
  }
34
  UNLOCK = 1;
35
  /////////////////////////////////////////////////////////////////  
36
  for (i = 0; i < 64; i++) 
37
    {
38
    if (i % 9 == 0) {
39
        // RAM loeschen Power On Reset
40
        ON_OFF = 0;
41
        DELAY100MS
42
        ON_OFF = 1;
43
        DELAY100MS
44
      
45
      // RAM gelöscht, D1 aud "1" bei ADR = i
46
      ucRomVal = Write_Value(0x7, ADR_DATA[i][0]);
47
      if (ucRomVal == 1) {
48
        ROM[i][0] = ucRomVal;
49
      }
50
51
        // RAM loeschen Power On Reset
52
        ON_OFF = 0;
53
        DELAY100MS
54
        ON_OFF = 1;
55
        DELAY100MS
56
      
57
      // RAM gelöscht, D2 aud "1" bei ADR = i
58
      ucRomVal = Write_Value(0x7, ADR_DATA[i][1]);
59
      if (ucRomVal == 1) {
60
        ROM[i][1] = ucRomVal;
61
      }
62
63
        // RAM loeschen Power On Reset
64
        ON_OFF = 0;
65
        DELAY100MS
66
        ON_OFF = 1;
67
        DELAY100MS
68
      
69
      // RAM gelöscht, D3 aud "1" bei ADR = i
70
      ucRomVal = Write_Value(0x7, ADR_DATA[i][2]);
71
      if (ucRomVal == 1) {
72
        ROM[i][2] = ucRomVal;
73
      }
74
75
        // RAM loeschen Power On Reset
76
        ON_OFF = 0;
77
        DELAY100MS
78
        ON_OFF = 1;
79
        DELAY100MS
80
      
81
      // RAM gelöscht, D4 aud "1" bei ADR = i
82
      ucRomVal = Write_Value(0x7, ADR_DATA[i][3]);
83
      if (ucRomVal == 1) {
84
        ROM[i][3] = ucRomVal;
85
      }
86
    }
87
  }
88
  UNLOCK = 0;
89
    //return 0;
90
}
91
void Write_Value(char daten1, char daten2) {  
92
    int x;                          // Clock count
93
    char Data[10];                  // Array holds the bits
94
  unsigned char ucRet_l = 0;
95
    unsigned char IntConf = INTCON; // Holds the interrupt status
96
   
97
  INTCON = 0;
98
    // Define RA2, RA3, RB4, RD7 and RE1 as outputs
99
  // These three bits are the mode bits
100
    Data[0] = ((daten1 & 0x04) ==  4) ? 1 : 0;
101
    Data[1] = ((daten1 & 0x02) ==  2) ? 1 : 0;
102
    Data[2] = ((daten1 & 0x01) ==  1) ? 1 : 0;
103
104
  // These three bits are the address bits
105
    Data[3] = ((daten2 & 0x40) == 64) ? 1 : 0;
106
    Data[4] = ((daten2 & 0x20) == 32) ? 1 : 0;
107
    Data[5] = ((daten2 & 0x10) == 16) ? 1 : 0;
108
109
  // These four bits are the data bits D1 - D4
110
    Data[6] = ((daten2 & 0x08) ==  8) ? 1 : 0;
111
    Data[7] = ((daten2 & 0x04) ==  4) ? 1 : 0;
112
    Data[8] = ((daten2 & 0x02) ==  2) ? 1 : 0;
113
    Data[9] = ((daten2 & 0x01) ==  1) ? 1 : 0;
114
  
115
  V35 = 1; // Programming Voltage is 5V
116
  V10 = 0; // No over voltage for changing the outputs to inputs
117
  V15 = 0; // No 15V needed
118
               // Introducing the programming of the RAM, high voltage pulse
119
    START = 1; // generate rising high voltage pulse, means V10 = 1
120
    DELAY1MS;  // 1 ms - Wait until the START Signal has reached its maximum value of > 10.5V
121
122
  A2_OUT();  // CLOCK, Make LATAbits.LATA2 of PIC to output, to write to AISC
123
    A3_OUT();  // DATA,  Make LATAbits.LATA3 of PIC to output, to write to AISC
124
125
    DATA = 0;  // set data  0, at the beginning msut be zero
126
    CLK = 0;   // set clock 0, at the beginning msut be zero
127
128
    START = 0; // generate falling edge high voltage pulse, V10 = 0, ASIC Voltage is 5V again
129
    DELAY1K;   // 84.4 us - short delay
130
131
    // Output 10 bits content of the Array into seriell DATA line
132
  for(x = 0; x < 10; x++) { 
133
    if (Data[x] == 1) {DATA = 1;}
134
    else {DATA = 0;}
135
        // Falling edge of the clock must be in middle of the DATA
136
    CLK = 1;        DELAY100; // 8.55 us
137
        CLK = 0;        DELAY100; // 8.55 us, The period of  clk is 17.1 us
138
  }    
139
  DATA = 0;
140
    // RAM_LOAD, 11th pulse
141
    CLK = 1;    DELAY100; // 8.55 us
142
  CLK = 0;    DELAY100; // 8.55 us
143
144
    // END, 12th pulse
145
    CLK = 1;    DELAY100; // 8.55 us
146
    CLK = 0;   DELAY100; // 8.55 us
147
148
    // End of ASIC programming, Changing the outputs to inputs
149
  A3_IN(); 
150
    A2_IN();
151
152
  DELAY10K;
153
  ucRet_l = ROM_READ;
154
155
  V35 = 1; // Programming Voltage is 5V
156
  V10 = 0;
157
  V15 = 0;
158
  INTCON = IntConf; // interrupts status loading
159
  //return ucRet_l;
160
}

von Volker S. (vloki)


Lesenswert?

Saif K. schrieb:
> dann bekomme jetzt eine andere Fehlermeldung:Error [1131] type mismatch
> in assignment

bisschen was drumrum?

von Saif K. (saif_k58) Flattr this


Lesenswert?

Hallo Volker,

Volker S. schrieb:
> bisschen was drumrum?

was mache ich dann falsch, wenn ich so was schreibe:
1
ucRomVal = Write_Value(0x7, ADR_DATA[i][1]);

Write_Value ist so deklariert:
1
void Write_Value(char daten1, int daten2);

Danke

von Volker S. (vloki)


Lesenswert?

Saif K. schrieb:
> was mache ich dann falsch, wenn ich so was schreibe:
>
>
1
> ucRomVal = void

?

von Saif K. (saif_k58) Flattr this


Lesenswert?

vielen dank
Das habe ich übersehen

jetzt habe ich angepasst und bekomme ich diese Fehlermeldung:
1
Error - section '.udata_func.o' can not fit the section. Section '.udata_func.o' length=0x00000242

von Volker S. (vloki)


Lesenswert?

Wenn das Ganze nach XC8 transferiert werden soll, dann würde ich 
vorschlagen, du machst das zuerst und erweiterst das Programm danach.
Das würde die Geschichte mit Variablen in einem Modul, die in der Summe 
mehr als eine BANK beanspruchen, erleichtern bzw. unnötige Arbeit 
vermeiden...

ODER du liest im User Guide des C18 Compilers nach ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.