C Kompilieren für einen w65c02 Mikroprozessor?

Guten Tag,

Ich probiere schon eine weile mit einem w65c02 Mikroprozessor inklusive EEPROM, RAM und IO-Interface herum. Bisher habe ich diesen immer mit VASM Assembly Code Programmiert und es hat auch alles geklappt. Allerdings möchte ich nun für Komplexere Programme diesen mit C Programmieren.

Nach einiger Recherche habe ich mir die vbcc Compiler heruntergeladen. Nun habe ich das Problem das dieser das Programm nicht Kompilieren will.

Kompilieren tu ich indem der folgende Befehl ausgeführt wird:

vc -65c02 +src\\W65C02.cfg -o bin\\a.out src\\main.c

Dieser wird auch soweit erfolgreich ausgeführt, allerdings wird am angegebenen Pfad keine Datei erstellt und es kommt auch keine Meldung das irgendetwas fehlgeschlagen ist.

Der Inhalt vom src\main.c ist nur ein leeres Programm:

void main(void) {
}

Der Inhalt von src\W65C02.cfg ist das Linker-Skript das genutzt wird (Wenn ich dieses option im Befehl weg lasse schlägt der Befehl mit der Ausgabe No config file! fehl). Hier habe ich zwei Inhalte ausprobiert. Den ersten habe ich mit Hilfe der vlink Dokumentation und etwas Recherche erstellt:

MEMORY {
    EEPROM : ORIGIN = 0x8000, LENGTH = 0x7FF9
    RAM : ORIGIN = 0x4000, LENGTH = 0x1FFF
}

SECTIONS {
    .text : {
        *(.text)
    } > EEPROM


    .data : {
        *(.data)
    } > RAM
}

Den zweiten habe ich in meiner Suche nach einer Lösung vom ChatGPT-4o erstellen lassen mit der Frage:

Schreibe ein Linker Skript für vlink das die Speicher Sektionen des 65c02 konfiguriert. Die Speicherbereiche sind folgende:
RAM: 4000 - 5FFF
EEPROM: 8000 - FFF9

Das Ergebnis war (zusammengefasst):

MEMORY {
    RAM   : ORIGIN = 0x4000, LENGTH = 0x2000  /* 4000 - 5FFF, Größe: 8 KB */
    EEPROM: ORIGIN = 0x8000, LENGTH = 0x7FFA  /* 8000 - FFF9, Größe: ca. 32 KB */
}

SEGMENTS {
    CODE:   load = EEPROM, type = ro
    RODATA: load = EEPROM, type = ro
    DATA:   load = RAM,    type = rw
    BSS:    load = RAM,    type = bss
}

Egal ob ich das erstes Linker-Skript oder das zweite genutzt habe es ist immer so abgelaufen wie oben beschrieben.

Als ich auf Fehlersuche war habe ich bei vc auch die Option -vv (very verbose) aktiviert und dann kam beim ersten Linker Skript folgende Ausgabe:

vc frontend for vbcc (c) in 1995-2020 by Volker Barthelmann
flags=1414 opt=1 len=1490
Argument 6:src\main.c
File "src\main.c"=2
add_name: "C:\Users\<user>\AppData\Local\Temp\vbcc068c.asm"


add_name: "C:\Users\<user>\AppData\Local\Temp\vbcc068c.o"
add_name: "C:\Users\<user>\AppData\Local\Temp\vbcc068c.o"


Argument 7:MEMORY {
File "MEMORY {"=5
add_name: "MEMORY {"
Argument 8:    EEPROM : ORIGIN = 0x8000, LENGTH = 0x7FF9
File "    EEPROM : ORIGIN = 0x8000, LENGTH = 0x7FF9"=5
add_name: "    EEPROM : ORIGIN = 0x8000, LENGTH = 0x7FF9"
Argument 9:    RAM : ORIGIN = 0x4000, LENGTH = 0x1FFF
File "    RAM : ORIGIN = 0x4000, LENGTH = 0x1FFF"=5
add_name: "    RAM : ORIGIN = 0x4000, LENGTH = 0x1FFF"
Argument 10:}
File "}"=5
add_name: "}"
Argument 12:SECTIONS {
File "SECTIONS {"=5
add_name: "SECTIONS {"
Argument 13:    .text : {
File "    .text : {"=5
add_name: "    .text : {"
Argument 14:        *(.text)
File "        *(.text)"=5
add_name: "        *(.text)"
Argument 15:    } > EEPROM
File "    } > EEPROM"=5
add_name: "    } > EEPROM"
Argument 17:    .data : {
File "    .data : {"=5
add_name: "    .data : {"
Argument 18:        *(.data)
File "        *(.data)"=5
add_name: "        *(.data)"
Argument 19:    }
File "    }"=5
add_name: "    }"
Argument 20:}
File "}"=5
add_name: "}"
linklen=296

free p->obj
"C:\Users\<user>\AppData\Local\Temp\vbcc068c.o"
free p
free p->obj
"MEMORY {"
free p
free p->obj
"    EEPROM : ORIGIN = 0x8000, LENGTH = 0x7FF9"
free p
free p->obj
"    RAM : ORIGIN = 0x4000, LENGTH = 0x1FFF"
free p
free p->obj
"}"
free p
free p->obj
"SECTIONS {"
free p
free p->obj
"    .text : {"
free p
free p->obj
"        *(.text)"
free p
free p->obj
"    } > EEPROM"
free p
free p->obj
"    .data : {"
free p
free p->obj
"        *(.data)"
free p
free p->obj
"    }"
free p
free p->obj
"}"
free p
free p->obj
"C:\Users\<user>\AppData\Local\Temp\vbcc068c.asm"
free p
free p->obj
"C:\Users\<user>\AppData\Local\Temp\vbcc068c.o"
free p

Beim ausführen vom zweiten Linker Skript mit -vv kommt eine ähnliche Ausgabe wo ebenfalls das Linker-Skript teilweise wiederholt wird.

Hoffe jemand weiß was ich falsch mache und kann helfen, lg Suiram1.

compiler, Code, Programmiersprache, vc, Assembly, C (Programmiersprache)
ESP32 Code gut?

Hi, ich würde gerne fragen ob dieser code gut ist weil ich kenne mich nicht aus und da kommt immer dieser fehlercode:
'sendDiscordNotification' was not declared in this scope

#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>


const char* ssid = "WLanSSID";
const char* password = "Password";


const char* webhook_url = "https://discord.com/api/webhooks/MyWebhook";



const int doorbellPin = 13;


bool doorbellState = LOW;


void setup() {
  Serial.begin(115200);
  

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Verbindung zum WLAN wird hergestellt...");
  }
  Serial.println("WLAN verbunden!");
  

  pinMode(doorbellPin, INPUT);
}


void loop() {
  doorbellState = digitalRead(doorbellPin);



  if (doorbellState == HIGH) {
    sendDiscordNotification();
    delay(5000);
  }


  delay(100);
}


void sendDiscordNotification() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;


    http.begin(webhook_url);


    http.addHeader("Content-Type", "application/json");



    String payload = "{\"content\": \"Es hat geklingelt!\"}";


    int httpResponseCode = http.POST(payload);


    if (httpResponseCode > 0) {
      String response = http.getString();
      Serial.println(httpResponseCode);
      Serial.println(response);
    } else {
      Serial.print("Fehler bei der HTTP Anfrage: ");
      Serial.println(httpResponseCode);
    }



    http.end();
  } else {
    Serial.println("WiFi Verbindung verloren");
  }
}
Arduino, Code, Programmiersprache, C (Programmiersprache), Arduino IDE
WIE KANN ICH IN C DAS ◻️und das ◼️ auf der Console ausgeben?

Hab diesen Code geschrieben:

#include <stdio.h>
#include <stdlib.h>
#include "console.h"
#define SIZE 8 // Größe des Schachbretts
char *schachbrett[SIZE][SIZE];// 2D-Array für das Schachbrett
void initSpielfeld();
void ausgabeSpielfeld();
void spielBeenden();
int main() {
initSpielfeld();
initConsole();

        ausgabeSpielfeld();
        getch();
        clrscr();
        gotoxy(0,0);

}
void initSpielfeld(){
    // Fülle das Schachbrett mit den richtigen Symbolen
    for (int i = 0; i < SIZE; i++) { // Zeilen
        for (int j = 0; j < SIZE; j++) { // Spalten
            // Wenn die Summe der Indizes gerade ist, ist das Feld weiß
            if ((i + j) % 2 == 0) {
                schachbrett[i][j] = "◻"; // Weißes Quadrat
            } else {
                schachbrett[i][j] = "◼"; // Schwarzes Quadrat
            }
        }
    }
}
void ausgabeSpielfeld(){
    // Gebe das Schachbrett aus
    for (int i = 0; i < SIZE; i++) { // Zeilen
        for (int j = 0; j < SIZE; j++) { // Spalten
            printf("%s ", schachbrett[i][j]); // Quadrat ausgeben
        }
        printf("\n"); // Neue Zeile nach jeder Zeile im Schachbrett
    }
}

void spielBeenden(){
    return 0;
}

Bei mir kommt da aber immer das raus:

Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝

Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗

Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝

Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗

Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝

Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗

Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝

Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗ Ôù╝ Ôù╗

Aber das ist nicht mein ziel.

Ich möchte einfach nur ein schönes Schachbrett ausgeben.

Kann mir da jemand helfen?

ASCII, Programmiersprache, C (Programmiersprache), UTF-8
Fehler bei Arduino-Programm (Arduino Uno)?

Mein Programm sollte eigentlich so funktionieren, dass beim drücken der einen Taste auf einer Fernbedienung der motorPin auf high gesetzt wird und der Motor sich eben dreht und bei einer anderen Taste der wieder aufhört. Die Tasten erkannt und sonst funktioniert auch alles, bis ich die Taste zum Einschalten vom Pin drücke. Der Pin schaltet sich auch an, aber danach wird im Serial Monitor nur noch

IR code:0x0
 other button   

angezeigt, ohne, dass überhaupt irgendwas gedrückt wird und der Pin lässt sich auch nicht mehr ausschalten. Wie fixe ich das?

das ist der Code:



#include "IRremote.h"

int receiver = 11; 
int motorPin = 6; 

IRrecv irrecv(receiver);   
uint32_t last_decodedRawData = 0;

void translateIR() 
{  
  if (irrecv.decodedIRData.flags)
  {
    irrecv.decodedIRData.decodedRawData = last_decodedRawData;
    Serial.println("REPEAT!");
  } else
  {
    Serial.print("IR code:0x");
    Serial.println(irrecv.decodedIRData.decodedRawData, HEX);
  }
 
  switch (irrecv.decodedIRData.decodedRawData)
  {
    case 0xF807FF00: digitalWrite(6, HIGH);    break;
    case 0xF609FF00: digitalWrite(6, LOW);    break;

    default:
      Serial.println(" other button   ");
  }
  last_decodedRawData = irrecv.decodedIRData.decodedRawData;
  delay(500);
}


void setup() 
{
  Serial.begin(9600);
  Serial.println("IR Receiver Button Decode");
  irrecv.enableIRIn();
  pinMode(6, OUTPUT); 


}


void loop()  
{
  if (irrecv.decode()) 
  {
    translateIR();
    irrecv.resume();
  }
}
Arduino, C (Programmiersprache), Arduino Uno, Arduino IDE

Meistgelesene Fragen zum Thema C (Programmiersprache)